首先聲明這篇學習記錄是基於python3的。
python3中,py文件中默認的文件編碼就是unicode,不用像python2中那樣加u,比如u'中文'。
不過在涉及路徑時,比如C:\Users\Administrator\Desktop\StudyNote\Python,還是要加r。
eg:r'C:\Users\Administrator\Desktop\StudyNote\Python'。
因為\是轉義符,想輸出'\'得寫成'\\'才可以。加了r就可以讓python自動處理字符串,不讓'\'進行轉義,因此最終的字符串就是C:\Users\Administrator\Desktop\StudyNote\Python的意思。
OK,繼續講。
首先要明確一點,你的py文件用什么文件編碼不重要,都可以順利執行。不過要保證一點,保存py文件時的編碼必須與編碼聲明的一樣。假設你的py文件開頭有以下編碼聲明:
eg: # -*- coding: utf-8 -*-
那么保存py文件時的編碼也要為utf-8。
另外再普及一下保存文件編碼時的知識,用notepad++在選擇編碼模式的時候,有utf-8和utf-8 without BOM,這個BOM實際上是在文件開頭加注了三個字符,用以表明本文件的編碼方式為utf-8,但這個是不需要的,往往會導致讀取文件的時候出錯(因為多了三個字符嘛,如果要去掉的話還得[3:]一下,挺麻煩的)。所以我們一般用utf-8 without BOM.
再言歸正傳。我們在處理文本文件的時候,如果該文件是unicode編碼,則不需要做任何的處理操作,直接用'r'參數讀取直接可用:
eg:
f=open('文件路徑','r') f_read=f.read() print(f_read)
這樣就能完整的輸出文件里的字符串。
如果不是unicode編碼,就不能直接用了,直接讀會出現亂碼。只能先以'rb'參數讀取二進制文件的方式讀取進來,read之后再解碼。
eg:
f=open('文件路徑','rb') f_read=f.read() f_read_decode=f_read.decode('該文件的編碼方式') print(f_read_decode)
這樣才能完整顯示,不然會有亂碼出現。
問題又來了,往往我們並不知道該文件的編碼方式,這該怎么辦?
幸好python有個強大的工具chardet
eg:
import chardet f=open('文件路徑','rb') f_read=f.read() f_charInfo=chardet.detect(f_read) f_charInfo的輸出是這樣的的一個字典{'confidence': 0.99, 'encoding': 'utf-8'}
前面‘confidence’是置信概率,后面是推斷出的編碼方式。以上的結果,意思為推斷這段字符串的編碼方式為'utf-8'的概率為99%.
經過我的測試,如果文件里的字符串比較少的話,chardet模塊是比較難判斷出正確的編碼模式的,體現在置信概率比較小,字符串多的話,概率會大。我覺得至少大於90%才可信。
得到編碼方式后,就可以用來解碼了。
f_read_decode=f_read.decode(f_charInfo['encoding'])
print(f_read_decode)
最后補充一下chardet的安裝方法:
pip install chardet
pip的安裝方法請自行百度。
