參考:ubuntu
https://segmentfault.com/q/1010000004268196/a-1020000004269556segmentfault
ubuntu下Python3使用open('filename', 'r').read()
讀取 .txt 文件時拋出異常:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 66: invalid start byte
當相同語句在Python2下運行時卻正常,請問問題出在哪裏啊?編碼
0x92
即 10010010
,UTF8 中編碼一個字符的第一個字節(start byte)只多是 0xxxxxxx
、110xxxxx
、1110xxx
、11110xxx
……然後面的字節只多是 10xxxxxx
。也就是說 0x92
只能做爲後面的字節,卻出如今了第一個字節的位置。spa
出現這種問題絕大部分狀況是由於文件不是 UTF8 編碼的(例如,多是 GBK 編碼的),而系統默認採用 UTF8 解碼。解決方法是改成對應的解碼方式。code
極少數狀況是由於文件損壞了或者和一部分非 UTF8 編碼混在一塊兒,能夠修復文件或採用 replace
等方式解碼。utf-8
Python 2 沒有問題是由於 Python 2 默認以字節流(對應 Python 3 的 bytes
)的方式讀文件,不像 Python 3 默認解碼爲 unicode
,把讀文件的方式改成 rb
有一樣的效果,不過 Python 3 中處理 bytes
還可能遇到不少問題就是了……unicode
最後決定,以二進制形式讀取,忽略特殊字符形成的轉碼錯誤,而後就能夠了:數據分析
contents = open('F:\\28\\數據分析\\MLiA_SourceCode\\machinelearninginaction\\Ch04\\\email\\ham/%d.txt'%i,'rb').read().decode('utf8','ignore')