这是在参照Yoon Kim的github实现论文Convolutional Neural Networks for Sentence Classification时遇到的问题。代码中使用的是经过处理的MR数据集。
原代码以二进制形式读取文件,代码形如:
with open(file, 'rb') as f:
for raw_line in f:
# process
但是我在运行时会报TypeError错误:
TypeError: sequence item 0: expected str instance, bytes found
一个简单的解决方式是不再使用二进制读取,改为普通读取,即去掉‘r’,但是此时抛出UnicodeDecodeError错误:
UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xf3 in position
4645: invalid continuation byte
初步推测这是文件中包含了utf8也无法解码的偏僻字符,导致报此错误。
我在百度上搜索了一会儿后发现中文网站上大多为 ‘gbk’ codec can’t decode byte XXX,然后解决方法是改为utf8编码,然而我的Python代码本身就是utf8编码。
吸取上次解决Ubuntu18的bug导致系统启动后黑屏的问题的教训,我在意识到百度上没有我想要的答案后,就到stackoverflow上搜索相关问题了,果然找到了解决方法。
1. 使用unicode解码:
with open(file, 'r') as f:
for str in f:
# unicode 是python2里的,我在python3测试会有问题
str = unicode(str, errors = 'replace')
# or
str = unicode(str, errors = 'ignore')
该方法返回一个不包含那些无法解析的字符的字符串。
2. 使用codecs读取文件:
import codecs
with codecs.open(file, 'r', encoding='utf-8',
errors='ignore') as f:
for str in f:
# process
关于utf8无法解析的字符串的问题,Python还有官方文档说明,有兴趣的同学可以参考一下。