python自学就是杨宗的学习记录

Python 3读取文件解码异常UnicodeDecodeErr

2017-12-17  本文已影响6人  就是杨宗
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

上一篇下一篇

猜你喜欢

热点阅读