UnicodeDecodeError: 'ascii' 编码无法解码位置 4 的字节 0xdf

0 投票
2 回答
2711 浏览
提问于 2025-04-18 15:54

我正在使用 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 个回答

1

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 是用来做相反的事情

其实这并不完全正确,可以这样理解:

  1. 解码(Decode)意味着“拿到某些东西,然后返回字节”
  2. 编码(Encode)意味着“拿到字节,然后把它们转换成字符”

如何将每个字符映射到它应该对应的内容,这就是“编码”;在这里你可以指定 utf-8 或其他编码方式。这样在解码时,它就知道要在正确的表中查找字符以获取字节值;同样,在编码时,它也知道要查找字节,然后将其转换为正确的字符。

2

使用 unidecode 这个包就可以解决问题。

from unidecode import unidecode 
Sraw = unidecode(f.read())

这样就可以了。

撰写回答