我有很多的中文样本,在应用jieba中文分词之后,想将分词的结果写入到txt文件中,报了如下错误:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 143: illegal multibyte sequence
于是开始了漫长的排查错误之旅:
1、我首先查看了我要写入数据的数据类型,为str
2、查看python3本身的编码方式,python3中包含decode和encode两种方式,其中decode是将其他字符转化为unicode中间类型,即:解码,而encode是将unicode类型转化为其他字符类型,即:编码。
3、于是,开始了第一次尝试:将str类型编码为utf-8类型,写入到文档中,事实证明写入是没有问题的,且写入的文件是byte型数据,如下:b'\xe5\xb0\x8a........首先这个不是我们想要的中文,只是unicode类型对象,.其次,当我试图再次读取这个文件的时候,我发现这个不可以被解码,查阅资料之后,发现是如下原因:
u ='中文' #指定字符串类型对象
str = u.encode('utf-8') #以utf-8编码对u进行编码,获得bytes类型对象
str1 = str.decode('utf-8') #如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容
也就是当我们对字符串进行编码之后,无法还原成原来的字符串内容,所以解码失败
4、于是尝试先对str进行编码,查看结果:代码如下
for j in a:
j=j.decode('utf-8')
f.write('%s'%j)
报错:AttributeError: 'str' object has no attribute 'decode'。。
查阅资料发现:You are trying to decode an object that is already decoded. You have astr, there is no need to decode from UTF-8 anymore.(意思就是str已经是decode之后的结果,那你还要对decode的结果在次decode,显然会报错!!)
5、继续查阅资料,有位大神指出,是我的pycharm 的File中设置IDE Encoding和Project Encoding和window系统默认的encoding编码方式不一样,即python3默认编码和windows10系统的编码方式不一致,于是统一更改为UTF-8(但是python3不是跨平台的么?这个按理说不应该有什么影响吧,事实也证明改这里并未解决我遇到的错误)
for j in a:
f.write('%s'%j)
f.close()
报错:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 143: illegal multibyte sequence,百思不得其解,郁闷,,于是又开始了新一轮的查阅资料
6、后来发现,在我打开文件时,没有指定打开文件的编码方式,我打开txt文件的源代码如下:
f=open('E:/Work/data/data.txt','r+')
这里,如果不指定打开方式,window系统默认会以gbk方式打开吧,于是在这里加上指定编码方式:
f=open('E:/Work/data/data.txt','r+',encoding='utf-8')
继续写入文件,success!!ok,困扰了这么久的问题终于解决了。