文件运行时报错UnicodeDecodeError: ‘gbk’ codec can’t decode byte … in position … : illegal multibyte sequence,解决容易,但是既然出了问题就要从根源上搞明白为什么出了错,所以我会分析原因,最后给出解决办法。
解决方法是通用的,如果出UnicodeDecodeError: ‘UTF-8’ codec can’t decode byte … in position … : illegal multibyte sequence 同理。
任何UnicodeDecodeError: '...' codec can't decode byte ... in position ... : illegal multibyte sequence
都可以用(●′ω`●) 。
问题
今晚python读文件的时候报了个错
分析原因
UnicodeDecodeError: ‘gbk’ codec can’t decode byte … in position … : illegal multibyte sequence
写的很清楚,Unicode解码失败,在…位置的…编码不能用GBK解码。
😕解释一下:
就是你的文件运行时候是用GBK编码进行解码的。
既然报错GBK没办法解码,就证明你读取的文件不是GBK编码方式的文件。
先看我编译器截图,代码部分直接用with open
打开文件,里面存了一首诗,现在编辑区直接打开txt是显示诗词的,但是运行以后会控制台会报错。
再来看看我的文件保存编码。左下角显示编码方式是UTF-8,所以编译器用GBK解码方式打开UTF-8编码的文件肯定会出问题。
为了证明我的分析是对的,我现在把我文本文件的编码方式改成GBK,用GBK解码GBK肯定是不会出问题的。看下图:
- 右下角sublime的左下角可以看到编码方式改成GBK了
- 左上角我的代码没进行任何修改
- 左下角控制台输出显示已经正常了——就证明我刚才的分析是对的
- 有一个小问题是右上角编译器里边看的txt却不正常了。
- 这种乱码是口字码,产生原因是用UTF-8解码了GBK文件
- 我用的编译器是pycharm,由此可见,现在的情况是pycharm编辑区直接打开txt用的是UTF-8编码,运行程序时候解码用的是GBK编码方式。
解决方法
知道产生问题的原因,那解决起来也方便了,就是让你的文件和运行文件时的解码方式一致就可以了。
为了让我的pycharm编辑区诗词显示正常,现在我把txt文件的编码方式改回UTF-8。
方法1
现在我们要做的就是运行文件的时候用UTF-8解码就行了,也就是把打开文件的语句改为:
with open('file_10.txt',encoding='UTF-8') as Poem:
encoding = 'UTF-8'
,重新修改打开文件解码方式,修改之后就好使了。如果不好使耐心往下看 (ง •̀_•́)ง 。
补充: 其他文章里提到的修改方式
with open('file_10.txt','r',encoding='UTF-8') as Poem:
有人加了个'r'
,其实就是加个open的mode参数(打开方式参数)而已,r
表示以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式,也就说你加不加都是默认以r
的方式打开,写了没啥用。
更多参数见:Python3 open() 函数with open('file_10.txt','rb') as Poem:
上面解释了r
,那这个rb
也很好理解,以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这个因电脑而异,有的人电脑上能用二进制解析出来,有的人就不能用,适用面比较窄。with open('file_10.txt',errors='ignore') as Poem:
顾名思义,errors='ignore'
就是忽略这个错误继续运行,那程序可以给你执行出来,但是会出现乱码(看下图我的执行结果),这种乱码叫古文码,出现原因是用GBK解码方式解码了UTF-8编码的文件。
为什么有的人用这句就好使?那个UnicodeDecodeError报错只是告诉你,你运行时读文件的解码方式不匹配,只是不匹配,没说解不出来。
编码方式有很多,他们能编码表示的文字范围也不一样,如果你用这个好使,就是你恰好撞上了,你运行时候的解码方式和你文件保存的编码方式是同一系列的,但是你运行文件解码的那个编码方式正好能完全解析出你的文件。所以这个方法好使,但是适用面也很窄很窄。with open('file_10.txt',encoding='gb18030') as Poem:
编码方式有很多,你可以用GBK方式打不开,UTF-8也不好使,那你电脑可能不是这两种编码方式,所以你试试别的。这句代码就是让你试试gb18030,有的人可能恰好那个txt文件就是gb18030编码方式,撞上了也是能打开的。所以这个encoding = '×××'
后边是不固定的,这个要取决于你电脑上那个txt的编码方式。你要改成相对应文件的那个编码方式才好使。
如何查看电脑文本文件的编码方式
-
如果你用sublime,打开文件,左下角就直接显示编码方式。
-
如果没有sublime,你用记事本打开你的文件,记事本右下角也是编码方式
-
如果你就啥也不想打开,那我建议你直接用
with open('file_10.txt',errors='ignore')
,然后看看出现了哪种乱码,你自己再对着改吧。
附赠乱码分类图
方法2 修改pycharm编码方法(一劳永逸 )
每次都加一句encoding = '×××'
也不是办法,所以我们应该找个简便方法直接修改pycharm编码方法。不用pycharm的别看了。
- 打开设置:File→Setting
- 修改编码:Editor→File Encoding,我建议你把绿色里框都改为UTF-8。
注意:这一步改了以后,你直接用with open('file_10.txt')
运行,输出可能还是报错。耐心往下看。
解释一下,这是因为程序运行的时候使用的是你计算机的默认编码,而你计算机的默认编码不是UTF-8。
现在你有两条路:- 把刚才所有的UTF-8选项都改为系统默认,也就是system default。(不推荐,建议使用下一个方法)
- 把计算机默认编码改为UTF-8,UTF-8适用范围广,有诸多好处,建议使用。WIN10修改编码方式看这里:Windows修改编码方式 win10
- 把刚才所有的UTF-8选项都改为系统默认,也就是system default。(不推荐,建议使用下一个方法)
全部改完以后就可以完美显示了╭(●`∀´●)╯:
我是萝莉安。程序媛永不服输。