1. 程式人生 > >解決UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c

解決UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c

問題

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還有

官方文件說明,有興趣的同學可以參考一下。