問題描述:
下面是一個(gè)非常簡單的讀取并打印文件內(nèi)容的示例:
with open('test.txt', 'r') as f:
contents = f.read()
print(contents)
在test.txt文本文件中,只有一個(gè) `你` 字:
test.txt
你
但是,我們在運(yùn)行這段代碼時(shí),出現(xiàn)了如下的錯(cuò)誤:

報(bào)錯(cuò):
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 2: incomplete multibyte sequence
分析問題:
首先我們得知道這個(gè)錯(cuò)誤是什么意思。
報(bào)錯(cuò)翻譯過來就是:
Unicode解碼錯(cuò)誤:“gbk”編解碼器無法解碼位置2的字節(jié)0xa0:不完整的多字節(jié)序列
通過了解報(bào)錯(cuò)信息,我們知道了這是一個(gè)解碼的錯(cuò)誤。要分析這個(gè)錯(cuò)誤,我們首先要對(duì)Python的字符編碼有一個(gè)基本的認(rèn)識(shí)。
對(duì)于Python字符編碼的問題,大家可以看看我的這篇博文:
一文搞懂Python字符編碼(編碼方式、亂碼和報(bào)錯(cuò)原因)_lyb06的博客-CSDN博客
在這篇博文中,我不僅介紹了字符編碼,還分析了這個(gè)報(bào)錯(cuò)出現(xiàn)的具體原因,但這里我們主要探討解決方法,就不做贅述了。想了解具體原因可看該文第3、4部分。
現(xiàn)在我們知道了這個(gè)錯(cuò)誤是因?yàn)槲覀兪褂胓bk(Windows 平臺(tái),默認(rèn)編碼是 gbk)對(duì)文本進(jìn)行解碼時(shí),有一處地方多出了一個(gè)字節(jié)無法解碼。gbk將一個(gè)漢字編碼為2個(gè)字節(jié),也就是每兩個(gè)字節(jié)可解碼為一個(gè)漢字,而一個(gè)字節(jié)無法解碼,故報(bào)錯(cuò),這也就解釋了報(bào)錯(cuò)信息后面的:incomplete multibyte sequence(不完整的多字節(jié)序列)。
出現(xiàn)這種問題,一般是由于該文本文件是用utf-8編碼的(utf-8將一個(gè)漢字編碼為3個(gè)字節(jié)),但我們卻使用gbk來解碼。由于二者對(duì)于漢字的編碼方式是不一樣的,解碼時(shí)又恰好出現(xiàn)了多余的無法解碼的字節(jié),因此就出現(xiàn)了報(bào)錯(cuò)。
為什么要說恰好出現(xiàn)多余的無法解碼的字節(jié)?
因?yàn)橛蟹N特殊情況不會(huì)報(bào)錯(cuò)!用utf-8編碼了兩個(gè)漢字(6個(gè)字節(jié)),此時(shí)用gbk可以將其解碼為3個(gè)漢字(6個(gè)字節(jié)分為3份2個(gè)字節(jié),可以對(duì)應(yīng)3個(gè)漢字),這種情況不會(huì)報(bào)錯(cuò),但顯示的信息不一樣,就是我們常說的亂碼 ,詳情見上面提到的博文。
你可將讀取的test.txt文件中的內(nèi)容改為兩個(gè)漢字 "你好" ,在運(yùn)行一下這個(gè)代碼,你會(huì)發(fā)現(xiàn)沒有報(bào)錯(cuò),但是打印出的信息就不是 '你好' 了。
5、要解決這個(gè)問題,我們就要讓Python用utf-8來解碼文件。
解決方法:
在使用open() 時(shí),我們添加參數(shù) encoding='utf-8'。使用這個(gè)參數(shù),相當(dāng)于我們就告訴了Python:我們這個(gè)文件是用utf-8編碼的,你一會(huì)兒對(duì)這個(gè)文件解碼的時(shí)候,就用utf-8解碼,不要用gbk解碼。
with open('test.txt', 'r', encoding='utf-8') as f:
contents = f.read()
print(contents)
輸出:文章來源:http://www.zghlxwxcb.cn/news/detail-604358.html

成功!問題解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-604358.html
到了這里,關(guān)于一文搞懂Python文件讀取報(bào)錯(cuò)UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!