解決UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c
阿新 • • 發佈:2019-01-30
問題
with open(file, 'rb') as f:
for raw_line in f:
# process
但是我在執行時會報TypeError錯誤:
TypeError: sequence item 0: expected str instance, bytes found
一個簡單的解決方式是不再使用二進位制讀取,改為普通讀取,即去掉‘r’,但是此時丟擲UnicodeDecodeError錯誤:
UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xf3 in position
4645: invalid continuation byte
初步推測這是檔案中包含了utf8也無法解碼的偏僻字元,導致報此錯誤。
解決方法
我在百度上搜索了一會兒後發現中文網站上大多為 ‘gbk’ codec can’t decode byte XXX,然後解決方法是改為utf8編碼,然而我的Python程式碼本身就是utf8編碼。
吸取上次解決Ubuntu18的bug導致系統啟動後黑屏的問題的教訓,我在意識到百度上沒有我想要的答案後,就到stackoverflow上搜索相關問題了,果然找到了解決方法。
1. 使用unicode解碼:
with open(file, 'r') as f:
for str in f:
# unicode 是python2裡的,我在python3測試會有問題
str = unicode(str, errors = 'replace')
# or
str = unicode(str, errors = 'ignore')
該方法返回一個不包含那些無法解析的字元的字串。
2. 使用codecs讀取檔案:
import codecs
with codecs.open(file, 'r', encoding='utf-8',
errors='ignore') as f:
for str in f:
# process
關於utf8無法解析的字串的問題,Python還有 官方文件說明,有興趣的同學可以參考一下。