1. 程式人生 > >python0.11-----文件/編碼和解碼/pickle模塊

python0.11-----文件/編碼和解碼/pickle模塊

enc 讀寫 obj utf-8 ros microsoft 網絡數 報錯 ror

文件:
python中的文件讀寫和c兼容,磁盤上的讀寫由操作系統完成,一般的程序無法操作磁盤。文件讀寫是通過操作系統對象完成,該對象稱為文件描述符。

文件的操作分兩種:

1.打開文件
open(path,flag[,encoding][,errors])
path:要打開文件的路徑。
flag:打開方式。
  r:以只讀的方式打開文件。文件的(描述符)指針放在文件開頭。
  rb:以二進制格式打開一個文件用於只讀,文件描述符放在文件開頭。
  r+:打開一個文件用於讀寫,文件描述符放到開頭。
  w:打開文件只用於寫入。若文件已經存在則會被覆蓋,若文件本身不存在,則會創建新文件。
  wb:打開一個文件只用於寫入二進制。若文件已經存在則會被覆蓋,若文件本身不存在,則會創建新文件。


  w+:打開一個文件用於讀寫。若文件已經存在則會被覆蓋,若文件本身不存在,則會創建新文件。
  a:打開一個文件用於追加。如果文件存在,文件描述符將會放到文件末尾。若文件本身不存在,則會創建新文件。
  a+:打開一個文件用於讀寫。如果文件存在,文件描述符將會放到文件末尾。若文件本身不存在,則會創建新文件。註意:因為文件描述符放在文件末尾,因此,讀文件讀不出來什麽東西。

encoding:編碼方式。
errors:錯誤處理方式,‘ignore‘表示若編碼和解碼方式不一致不會報錯,‘strict‘表示若編碼和解碼方式不一致會報錯。
註意:網絡數據是以二進制進行傳輸的。因此存在‘wb‘,‘rb‘。

例子:


f=open(r‘C:\Users\yuliang\Desktop\Project\lrc.txt‘,‘r‘,encoding=‘utf-8‘,errors=‘ignore‘)
註意:f代表的是已經打開的文件。
2.1 從文件中讀出內容:
#1.讀取文件的全部內容:str1=f.read(),此時文件描述符已經來到了文件的末尾。
註意:若文件很大,有1G以上,那麽文件內容全部存到內存裏面去了,這樣顯然不好。
#2.讀取指定的內容:str1=f.read(num),讀取文件描述符後面的num個字符數,此時文件描述符向右移動num個字符位置。
#3.讀取整行,包括‘\n‘字符:str1=f.readline(),文件描述符放到下一行的行首。另外,str1=f.readline(num)跟str1=f.read(num)功能一樣,不過很少用。

#4.讀取所有行並返回列表:list1=f.readlines()。文件描述符放到文件末尾。另外,list=f.readlines(num),若給定數字大於0,就讀取就實際size的行數。不過很少用。
#5.修改描述符的位置:f.seek(num)。表示將文件描述符放在離文件開頭num個字符的位置。

2.2 向文件寫入內容:
#1 將信息str1寫入緩沖區 f1.write(str1)
#2刷新緩沖區
f1.flush() :直接將緩沖區的內容立即寫入文件。若不加這個語句,則文件在關閉的時候才將緩沖區的內容寫入到內存裏面區。若緩沖區滿了,也會自動將緩沖取內容立即寫入文件。

3.關閉文件
f.close

#一個完整的過程
try:
  f1=open(path,‘r‘)
  print(f1.read())
finally:
  if f1:   #若f1正常打開,則關閉,否則無須關閉。

    fi.close

#更簡單的讀取方式:
with open(path,‘r‘) as f1:
  print(f1.read())
不管文件打開成功或者失敗,with最後都可以自動將文件給關上。

#寫內容的簡單方式,不用關閉,不用刷新
with open(path,‘a‘) as f1:
  f1.write(str)

編碼和解碼:
with open(path,‘wb‘,encoding=‘utf-8‘) as f1:       #wb表示將存入文件的數據應該為字節類型。
  f1.write(str1.encoding(‘utf-8‘))            #將字符串str1用utf-8格式編碼成為二進制模式並寫入文件。若不編碼,則報錯:a bytes-like object is required, not ‘str‘。


with open(path,‘rb‘) as f1:
  date=f1.read()    #讀出來的是二進制文件,date是字節類型class ‘bytes‘。
  newDate=date.decode(‘utf-8‘)   #所以要將字節類型以utf-8格式解碼為字符串類型。若不解碼,則無法得到正常的字符串。

註意:若文件保存的編碼格式是utf-8,那麽用gbk的格式讀取內容將會報錯: ‘gbk‘ codec can‘t decode byte 0xae in position 40: illegal multibyte sequence。
errors=‘ingnore‘會忽略打開文件的編碼解碼不一致錯誤,無能忽略二進制文件編碼時產生的錯誤。

pickle模塊:數據持久性模塊。它可以把list,tuple,dict,set數據寫入文件。

使用pickle模塊的方法:
#打開文件:f1=open(path,‘wb‘)
#使用pickle模塊存儲數據:pickle.dump(data,f1)
#關閉文件:f1.close()
#打開文件:f2=open(path,‘rb‘)
#讀取pickle文件內容:pickle.load(f2)
#關閉文件:f2.close()
註意:因為dump和load會將將其他數據類型轉化為二進制的字節類,因此,文件的讀寫方式應該是‘wb‘和‘rb‘形式。若讀方式不是二進制的形式,則會報錯:write() argument must be str, not bytes

python0.11-----文件/編碼和解碼/pickle模塊