簡體   English   中英

UnicodeDecodeError:“ ascii”編解碼器無法解碼位置4的字節0xdf

[英]UnicodeDecodeError: 'ascii' codec can't decode byte 0xdf in position 4

我正在使用python 2.7.3,並嘗試讀取文本,對其中的單詞進行計數,並將單詞和計數一起寫入文本文件。 輸入文件(xml)具有以下輸入:

但是,我的榮幸。 Chingford成員的朋友(Tebbit先生)不知道-我也不是Lynn先生的政客記錄。

我不斷收到臭名昭著的錯誤:UnicodeDecodeError:'ascii'編解碼器無法解碼位置4的字節0xdf:序數不在range(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)

我知道解碼用於將字符串轉換為unicode,而編碼則相反,並嘗試相應地更改我的代碼,但無法弄清楚該如何解決。 任何意見是極大的贊賞。

使用unidecode

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

會成功的

U不是為unicode提供支持,而是為通用換行符提供支持:

除了標准的fopen()值模式外,還可以是“ U”或“ rU”。 Python通常是通過通用換行符支持構建的。 提供“ U”會以文本文件的形式打開文件,但是行可能會被以下任一終止:Unix行尾約定“ \\ n”,Macintosh約定“ \\ r”或Windows約定“ \\” r \\ n'。 所有這些外部表示都被Python程序視為'\\ n'。 如果構建的Python沒有通用換行符,則支持'U'的模式與普通文本模式相同。 請注意,如此打開的文件對象還具有一個名為換行符的屬性,該屬性的值為None(如果尚未看到任何換行符),'\\ n','\\ r','\\ r \\ n'或包含所有內容的元組看到的換行符類型。

如果您的文件使用utf-8編碼,則需要使用codecs.open打開文件,並codecs.open提供正確的編碼:

import codecs

with codecs.open(filename, mode='r', encoding='utf-8') as f:
    for line in f:
       # do stuff

我知道解碼用於將字符串轉換為unicode,而編碼則相反

其實這並不完全正確,請這樣想:

  1. 解碼的意思是“拿東西,然后返回字節”
  2. 編碼的意思是“獲取字節並將其轉換為字符”

如何映射每個字符應該翻譯成什么,這就是“編碼”; 在這里您可以指定utf-8或其他編碼。 因此,在解碼時,它知道在正確的表中查找字符以獲取字節值。 類似地,在編碼時,它知道先查找字節,然后將其轉換為正確的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM