UnicodeDecodeError:' ascii'编解码器不能解码位置4中的字节0xdf

时间:2014-08-04 10:53:55

标签: python unicode encoding

我正在使用python 2.7.3,并尝试读取文本,计算其中的单词,并将单词和计数一起写入文本文件。 输入文件(xml)具有以下输入:

        但我的权利是什么。朋友Chingford的成员(Tebbit先生)不知道ߞ我也不是Lynn先生作为政治家的记录。       

我一直收到臭名昭着的错误: UnicodeDecodeError:'ascii'编解码器无法解码位置4中的字节0xdf:序数不在范围内(128),我认为这是我无法解码/编码this character entity的结果。 相关代码是:

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)

我知道解码用于将字符串转换为unicode,而编码应该相反,并试图相应地更改我的代码,但无法弄清楚如何解决这个问题。非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

使用unidecode

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

会做到这一点。

答案 1 :(得分:1)

U不支持unicode,适用于universal newlines

  

除了标准的fopen()值模式可能是'U'或'rU'。   Python通常使用通用换行符支持构建;提供'U'   将文件作为文本文件打开,但行可以被任何一个终止   以下内容:Unix的行尾约定'\ n',Macintosh   约定'\ 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
  

我知道解码用于将字符串转换为unicode并且编码是   应该做相反的事情

实际上这并不完全正确,可以这样想:

  1. 解码意味着“拿东西,并返回字节”
  2. 编码意味着“占用字节,并将其转换为字符”
  3. 如何映射每个字符应该被翻译成什么,这就是“编码”;这里是指定utf-8或其他编码的地方。在解码时就是如此,它知道在正确的表中查找字符以获得字节值;类似地,当编码时,它知道查找字节然后将其转换为正确的字符。