Python 3读取文件解码异常UnicodeDecodeErr
1、遇到了解码问题
今天在做中文语料库的预处理工作,读文件的时候提示解码错误,UnicodeDecodeError,总结一下解决的办法……
2、写在前面
字符需要指定编码格式,然后才能以字节的形式存储到磁盘,下次打开文件,需要使用相同编码格式进行解码,才不会出现乱码的情况。
3、打开文件需要指定编码格式
在Python(或者其它编程语言)中,打开文件时with open(file_url, 'r', edcoding='utf-8') as f:
,需要指定编码格式,默认编码格式为当前平台的格式,我的是gbk,打开时指定的编码格式要与存储编码格式相同。
4、判断文件的编码格式
在Python中可以使用chardet.detect函数判断文件的编码格式:
BLOCK_SIZE = 1048576 # or some other, desired size in bytes
# 判断文件的编码格式
with open("E:\自然语言处理数据集\搜狐新闻数据(SogouCS)\\news.sohunews.010802.txt", "rb") as f:
data = f.read(BLOCK_SIZE)
print(chardet.detect(data))
然而判断结果可能并不准确,这里有一个我的亲身案例:显示为gb2312编码,(置信度居然还为0.99),后来用排除法才知道正确编码是gb18030。
5、关于ANSI
用记事本打开文件,另存为那里如果显示ANSI,并不意味着ANSI是该文件的编码格式,因为ANSI并不是一种编码格式。
6、排除法
可以使用排除法来确定文件的存储编码格式,既然用notepad++打开可以正确显示中文,基本上就是utf-8,gbk,gb2312和gb18030(其中gb18030能够编码更多的字符)。
7、善用异常
即便是用gb18030读取文件,依然会有一些非法字符无法解码,这时我们就可以使用异常机制,当抛出UnicodeDecodeError的时候,就跳过当前文档,继续处理剩下的文本,为了避免出现不完整的文本,最好把出异常的文本也删了。
8、程序代码
我处理的这些文本编码格式都为gb18030,为了后续处理的方便和统一,将它们都转为utf-8的编码格式,转换文本编码的函数为convert_files_encoding(src_parent_path, target_parent_path, src_encoding, target_encoding="utf-8", filename_suffix='')
,具体代码见我的github。
9、小结
所以啊,文件存储编码格式就得用utf-8,windows记得用utf-8无BOM,这可以省掉很多麻烦(奈何这些待处理的语料文本编码格式全部都是gb18030......)。
转载请注明如下内容:
文章来自简书,作者:就是杨宗
原文链接:http://www.jianshu.com/p/9cb55b7173ae