首页 文章

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

提问于
浏览
0

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

  • 1

    使用unidecode

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

    会做的 .

  • 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,而编码则应该相反

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

    • 解码意味着"take something, and return the bytes"

    • 编码意味着"take bytes, and convert them into characters"

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

相关问题