2019-07-05 編碼格式和文件操做

1、字符編碼python

  字符編碼針對的是文字,字符編碼只跟文本有關,這裏不須要考慮視頻、音頻等其餘文件。windows

  人在操做計算機的時候輸入的是人能看懂的字符,可是計算機只能識別010101這樣的二進制數據,那麼就須要用字符編碼表來處理字符與數字的對應關係。編碼

  最先的是ASCII表,用八位二進制表示一個英文字符,可是它只能表示英文和一些符號,不適合中文。因此中國本身出了一個GBK編碼格式,用2Bytes表示一箇中文字符。基於上面的推導,每一個國家的文字都不同,那麼用的編碼格式也不同,若是要相互使用就很方便。因此出了一個萬國碼unicode,統一用2Bytes表示全部字符。spa

  unicode有兩個特色:1.由於全部字符都是用2Bytes表示字符,因此會浪費不少存儲空間。2.io次數增長,程序運行效率下降(這個是致命的)操作系統

  後面針對這兩個特色進行修改:當內存中的unicode編碼格式數據存在硬盤的時候,會按照utf-8編碼。將unicode的英文字符由原來的2Bytes變成1Bytes。將unicode中文字符由原來的2Bytes變成3Bytes。code

  如今的計算機:視頻

    內存是unicode對象

    硬盤是utf-8blog

  須要掌握的:內存

    unicode的兩個特色:

      1.在用戶輸入的時候,不管輸入什麼字符都可以兼容萬國字符

      2.其餘國家編碼的數據由硬盤讀到內存的時候unicode與其餘國家的編碼都有對應的關係。

    數據由內存存到硬盤:

      1.內存中的unicode格式二進制數據      >>>經過編碼(encode)>>>      硬盤中utf-8格式的二進制數據

      2.硬盤中utf-8格式的二進制數據     >>>經過解碼(decode)>>>      內存中unicode格式的二進制數據

    咱們要清楚文件爲何會亂碼:由於文件存的格式和讀取的格式不同(******)

x = ''

#第一種方法:
# res1 = bytes(x,encoding='utf-8')
# print(res1,type(res1))
# res2 = str(res1,encoding='utf-8')
# print(res2,type(res2))

#第二種方法
res = x.encode('utf-8')
print(res)    #b'\xe4\xb8\x8a'
print(type(res))    #<class 'bytes'>
print(res.decode('utf-8'))    #

 

  這裏有個python2和python3的不一樣點:

  python2:將py文件按照文本文件讀入解釋器默認使用ASCII碼

  python3:將py文件按照文本文件讀入解釋器中默認使用utf-8

文件頭:# coding:utf-8   在py文件開頭寫這個文件頭,編碼格式會自動轉爲這個

 

補充:1.pycharm終端使用的是utf-8格式

   2.windows終端採用的是gbk

字符編碼總結:

  咱們用代碼來舉例:

    x = '上'

    res1 = x.encode('utf-8')    #將unicode編碼變成能夠存儲和運輸的utf-8的二進制數據

    res2 = res1.decode('utf-8')  #將硬盤中utf-8格式的二進制數據解碼成unicode格式的二進制數據

 

2、文件操做

    文件處理包括三個步驟:  打開(open) /讀寫(read,write)/  關閉(close) 

# 經過python代碼操做文件
# r取消轉義
 f = open(r'D:\Python項目\day07\a.txt',encoding='utf-8')  # 向操做系統發送請求  打開某個文件
# 應用程序要想操做計算機硬件 必須經過操做系統來簡介的操做
 print(f)  # f是文件對象
 print(f.read())  # windows操做系統默認的編碼是gbk
 f.read()  # 向操做系統發請求 讀取文件內容
 f.close()  # 告訴操做系統 關閉打開的文件
 

    用open打開的文件必定要記得寫close關閉

    上面的這種操做方法比較複雜,因此出了文件上下文操做

    with open  的方法,這個用法不用寫close,還能夠同時打開幾個文件。

with open(r'D:\Python項目\day07\a.txt',encoding='utf-8') as f ,\
        open(r'D:\Python項目\day07\b.txt',encoding='utf-8') as f1:  # f僅僅是一個變量名 你把它當作是一個遙控器
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())

    文件打開模式:

      r  只讀模式     默認的模式

      w  只寫模式

      a  追加寫模式

    操做文件單位的方式:

      t    文本文件    默認的,能夠不用寫,在操做文本文件的時候,必定要指定encoding參數,若是不添加encoding參數默認是操做系統的默認編碼(gbk)

      b   二進制數據文件(好比視頻,音頻文件)     若是用了這個就不要寫encoding參數

    r   只讀模式

      r模式在打開文件的時候,若是文件不存在直接報錯

      有三種讀取方式:read,readline,readlines

        read:一次性將文件所有讀取,返回的數據是字符串格式,缺點是若是文件太大,會佔滿內存

        readline:讀取文件內容的一行,返回的數據也是字符串格式

        readlines:每一行每一行的讀,每一行當成一個字符串,全部數據放在一個大列表當中

 
#讀取文本文件用rt
with open(r'D:\Python項目\day07\a.txt',mode='rt',encoding='utf-8') as f:
     print(f.readable())  # 是否可讀
     print(f.writable())  # 是否可寫
     print(f.read())  # 一次性將文件內容所有讀出
   for i in f: #f能夠被for循環 每for循環一次,就讀取一行內容
      print(i) #這個方法能夠解決一次性讀取文件佔用內存過大的問題
#讀取二進制文件用rb with open(r'D:\Python項目\day07\1.jpeg',mode='rb') as f: print(f.readable()) # 是否可讀 print(f.writable()) # 是否可寫 print(f.read()) # 一次性將文件內容所有讀出 print(f.read()) # 讀完一次以後 文件的光標已經在文件末尾了,再讀就沒有內容了可讀 print(f.readlines()) # 返回的是一個列表 列表中的一個個元素對應的就是文件的一行行內容

    w  只寫模式(這個模式要慎用,若是文件自己有內容的話,寫入的時候會被清空

        1.當文件不存在的時候,會自動建立文件

        2.當文件存在的時候,先清空文件內容,而後再寫入

        有三種寫入方式:write/writeline/writelines

 with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
     print(f.readable())  # 是否可讀
     print(f.writable())  # 是否可寫
     f.write('不不不,你沒有翻~\n')
     f.write('不不不,你沒有翻~\n')
     f.write('不不不,你沒有翻~\n')
     f.write('不不不,你沒有翻~\r')
     f.write('不不不,你沒有翻~')


     l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你沒sa翻~\n']
     f.writelines(l)
     # 上下等價
     for i in l:
         f.write(i)

    a      追加模式

      1.在文件不存在的狀況下,自動建立文件

      2.當文件存在的狀況下,不清空文件內容,文件光標會移動到文件的最後,在原有的基礎上追加

    a模式不可讀,只能寫

with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    print(f.readable())  # 是否可讀   False
    print(f.writable())  # 是否可寫   True
    f.write('我是小尾巴\n')

 

具體的詳細內容能夠參考:http://note.youdao.com/noteshare?id=17303322fcbc09a85d9bd5195dec25ae&sub=F9D47851E02B4CB7A341119637EC6BAE

相關文章
相關標籤/搜索