问题描述
Windows下使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到下面问题:
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position …
解决办法
网络数据流写入文件时,我们会遇到几个编码:
-
#encoding=’XXX’
(Python文件第一行的内容)的编码是指该Python脚本文件本身的编码,无关紧要。只要XXX和文件本身的编码相同就行了。 比如notepad++ “格式”菜单里面里可以设置各种编码,这时需要保证该菜单里设置的编码和encoding='XXX'
相同就行了,不同的话会报错 -
网络数据流的编码(比如获取网页),那么网络数据流的编码就是网页的编码。需要使用decode解码成
unicode编码
。 -
目标文件的编码要将网络数据流的编码写入到新文件,那么我么需要指定新文件的编码。写文件代码如:
f.write(txt)
那么txt是一个字符串,它是通过decode解码过的字符串。
关键点就要来了:目标文件的编码是导致标题所指问题的罪魁祸首。
如果我们打开一个文件:
f = open("out.html","w")
在Windows下面,新文件的默认编码是gbk,这样的话,Python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。 解决的办法就是,改变目标文件的编码:
f = open("out.html","w",encoding='utf-8')
至此,问题将不复存在。