UnicodeDecodeError: 'ascii' 编码无法解码位置 4 的字节 0xdf
我正在使用 Python 2.7.3,想要读取一段文本,统计其中的单词数量,并把单词和数量写入一个文本文件。输入文件(xml)包含以下内容:
但是我尊敬的朋友,来自 Chingford 的议员(Mr. Tebbit)不知道的事情——我也不知道——是 Lynn 先生作为政治家的记录。
我总是遇到一个臭名昭著的错误: UnicodeDecodeError: 'ascii' 编码无法解码位置 4 的字节 0xdf:序号不在范围内(128),我认为这是因为我没有正确解码/编码 这个字符。 相关的代码是:
import codecs, sys
sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
f = open(fullfile, 'rU')#, 'rU')#read as unicode
Sraw = f.read()
Sraw = Sraw.decode('utf8','ignore').encode('utf8','ignore')# modified, doesn't help
当我尝试将单词添加到列表中(或者打印它们,比如说)时,程序就崩溃了:
words =(nltk.wordpunct_tokenize(sentence.strip()))
dwords.extend(words)
我知道 decode 是用来将字符串转换为 Unicode 的,而 encode 则是反向操作,我试着相应地修改我的代码,但还是搞不定这个问题。任何建议都非常感谢。
2 个回答
U
不是用来支持 Unicode 的,而是用来处理 通用换行符的:
除了标准的 fopen() 模式外,模式还可以是 'U' 或 'rU'。Python 通常是支持通用换行符的;使用 'U' 打开文件时,它会把文件当作文本文件来处理,但文件中的行可以用以下任意一种方式结束:Unix 的换行符 '\n',Mac 的换行符 '\r',或者 Windows 的换行符 '\r\n'。在 Python 程序中,这些不同的换行符都会被视为 '\n'。如果 Python 是在没有通用换行符支持的情况下构建的,那么带有 'U' 的模式和普通文本模式是一样的。需要注意的是,这种方式打开的文件对象还有一个叫做 newlines 的属性,它的值可能是 None(如果还没有遇到换行符),也可能是 '\n'、'\r'、'\r\n',或者是一个包含所有遇到的换行符类型的元组。
如果你的文件是用 utf-8 编码的,你需要用 codecs.open
来打开它,并给它正确的编码:
import codecs
with codecs.open(filename, mode='r', encoding='utf-8') as f:
for line in f:
# do stuff
我知道 decode 是用来把字符串转换成 Unicode 的,而 encode 是用来做相反的事情
其实这并不完全正确,可以这样理解:
- 解码(Decode)意味着“拿到某些东西,然后返回字节”
- 编码(Encode)意味着“拿到字节,然后把它们转换成字符”
如何将每个字符映射到它应该对应的内容,这就是“编码”;在这里你可以指定 utf-8 或其他编码方式。这样在解码时,它就知道要在正确的表中查找字符以获取字节值;同样,在编码时,它也知道要查找字节,然后将其转换为正确的字符。