最近在使用python3做NLP中文文本分类时,遇到如下非常恼人的问题,一开始没有在意,后来忍无可忍弄了一天。
UnicodeDecodeError: 'utf8' codec can't decode byte 0xcc in position 468: invalid continuation byte
分析原因
原代码段
with open(filename,"r",encoding='utf-8') as f:
content = f.read()
主要原因
和下载的搜狗语料库本身的编码有关系,本身编码是ASCII码,而我们需要以UTF-8来读取,这就超出python3的能力了就会报错。
如何查看编码
有很多命令可以用于查看,比如enca还有万能的VIM,但是我比较喜欢使用file命令,如下显示的是UTF-8格式的。
$ file Chinesestopword.txt
Chinesestopword.txt: UTF-8 Unicode text
插播:常用编码
- ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。
- 拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符
- GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示简体中文,GB18030表示繁体中文。
- Unicode编码:包含世界上所有的字符,是一个字符集。
- UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度。
解决办法
说出来这个解决办法,不知道是因为我电脑的原因,还是我电脑的原因,折腾了好久好久,以下提供几个方法,供大家参考,此时此刻感叹win有win系统的好啊!
win系统下暴力解决
一个小小的记事本居然能完成Mac完不成的任务,用了这个方法,我的Mac坟头草都好几米了,方法见下图:文件->另存为
看见下边这个编码了吗,他可以轻松实现编码转换,转化完还没有乱码,唯一的缺点就是需要手动解决,小数量的还可以,数量较大的时候还是选择下面这个方法吧~
使用命令工具
- 在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式
:set fileencoding=utf-8
- enconv 转换文件编码,比如要将一个GBK编码的文件转换成UTF-8编码,操作如下
enconv -L zh_CN -x UTF-8 filename
- iconv 转换,iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
iconv -f UTF-8 -t GBK file1 -o file2 #将一个UTF-8 编码的文件转换成GBK编码
更好的傻瓜型命令行工具enca
它不但能智能的识别文件的编码,而且还支持成批转换。
Mac下安装
brew install enca
检查文件编码
enca -L zh_CN ip.txt
Simplified Chinese National Standard; GB2312
转换文件编码
$enca -L 当前语言 -x 目标编码 文件名
-L zh_CN 一般也可以不用指定。
批量转换
enca -x utf-8 *
总结
做数据挖掘的人绝不轻易低头,可能最近太偏执了,浪费了两天,其实只要换个思路,这台电脑不行,换个win试试也许许多问题都迎刃而解,学习做项目还是需要灵活一些~
以上这种方法,我最后成功的只有第一种,无奈,以后在解决吧~
对编码终于有了初步了解了哈哈,已经比以前淡定多了,出了问题不久解决吗,哈哈哈哈哈
多谢
https://segmentfault.com/a/1190000007073776?_ea=1252426
http://blog.csdn.net/csywwx2008/article/details/17137097