文件的讀寫操作默認使用系統編碼,可以通過調用sys.getdefaultencoding() 來得到。在大多數機器上面都是utf-8 編碼。如果你已經知道你要讀寫的文本是其他編碼方式,那么可以通過傳遞一個可選的encoding 參數給open() 函數。如下所示:
with open('somefile.txt', 'rt', encoding='latin-1') as f:
...
Python 支持非常多的文本編碼。幾個常見的編碼是ascii, latin-1, utf-8 和utf-16。在web 應用程序中通常都使用的是UTF-8。ascii 對應從U+0000 到U+007F 范圍內的7 位字符。latin-1 是字節0-255 到U+0000 至U+00FF 范圍內Unicode 字符的直接映射。當讀取一個未知編碼的文本時使用latin-1 編碼永遠不會產生解碼錯誤。使用latin-1 編碼讀取一個文件的時候也許不能產生完全正確的文本解碼數據,但是它也能從中提取出足夠多的有用數據。同時,如果你之后將數據回寫回去,原先的數據還是會保留的。
是文本文件中可能出現的編碼錯誤。但你讀取或者寫入一個文本文件時,你可能會遇到一個編碼或者解碼錯誤
>>> f = open('sample.txt', 'rt', encoding='ascii') >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal
如果出現這個錯誤,通常表示你讀取文本時指定的編碼不正確。你最好仔細閱讀說明並確認你的文件編碼是正確的(比如使用UTF-8 而不是Latin-1 編碼或其他)。如果編碼錯誤還是存在的話,你可以給open() 函數傳遞一個可選的errors 參數來處理這些錯誤。下面是一些處理常見錯誤的方法:
>>> f = open('sample.txt', 'rt', encoding='ascii', errors='replace') >>> f.read() 'Spicy Jalape?o!' >>> # Ignore bad chars entirely >>> g = open('sample.txt', 'rt', encoding='ascii', errors='ignore') >>> g.read() 'Spicy Jalapeo!' >>>
如果你經常使用errors 參數來處理編碼錯誤,可能會讓你的生活變得很糟糕。對於文本處理的首要原則是確保你總是使用的是正確編碼。當模棱兩可的時候,就使用默認的設置(通常都是UTF-8)。