2009-06-19 5 views
0

Zum ersten Mal in eine Weile Python zu tun, und ich habe Probleme, eine einfache Scan einer Datei zu tun, wenn ich das folgende Skript ausführen mit Python 3.0.1,UnicodeDecodeError beim Lesen Wörter aus dem Wörterbuch-Datei mit einfachen Python-Skript

with open("/usr/share/dict/words", 'r') as f: 
    for line in f: 
     pass 

ich erhalte diese Ausnahme:

Traceback (most recent call last): 
    File "/home/matt/install/test.py", line 2, in <module> 
    for line in f: 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1744, in __next__ 
    line = self.readline() 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1817, in readline 
    while self._read_chunk(): 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1565, in _read_chunk 
    self._set_decoded_chars(self._decoder.decode(input_chunk, eof)) 
    File "/home/matt/install/root/lib/python3.0/io.py", line 1299, in decode 
    output = self.decoder.decode(input, final=final) 
    File "/home/matt/install/root/lib/python3.0/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1689-1692: invalid data 

die Zeile in der Datei auf sie explodiert ist „Argentinier“, die in irgendeiner Weise ungewöhnlich zu sein scheinen nicht.

aktualisieren: Ich habe,

encoding="iso-8559-1" 

zum open() Anruf, und es das Problem behoben.

+0

Sind Sie sicher, dass Sie nicht 'iso-8859-1' gemeint hat? Das scheint viel häufiger zu sein. Außerdem ist \ xf3 "ó" in Asunción in iso-8859 (und sein Codepunkt U + 00F3 in Unicode), aber in UTF-8 würde es als '\ xc3 \ xb3' dargestellt. – Malvolio

+0

@Malvolio: Es ist durchaus möglich, dass ich den Kodierungsnamen falsch eingegeben habe ;-) –

Antwort

1

Wie haben Sie aus "Position 1689-1692" ermittelt, in welcher Zeile in der Datei es gesprungen ist? Diese Zahlen wären Versätze in dem Stück, das es zu entschlüsseln versucht. Du hättest bestimmen müssen, welches Stück es war - wie?

Versuchen Sie dies auf der interaktiven Eingabeaufforderung:

buf = open('the_file', 'rb').read() 
len(buf) 
ubuf = buf.decode('utf8') 
# splat ... but it will give you the byte offset into the file 
buf[offset-50:60] # should show you where/what the problem is 
# By the way, from the error message, looks like a bad 
# FOUR-byte UTF-8 character ... interesting 
+0

Ich hatte es die Zeile ausdrucken, wie es über sie geschleift, und angenommen, dass es explodiert die Zeile nach dem letzten Ausdruck, als die Ausnahme ausgelöst wurde. Aber ich habe versucht, was du vorgeschlagen hast, und es scheint an einem anderen Punkt zu explodieren. Ich habe: buf [9881-20: 9881 + 20] = b "as \ nAsturias \ nAsunci \ xf3n \ nAsunci \ xf3n \ nAswan \ n" , die in "Asunción" tatsächlich einen lustigen Charakter hat. –

+0

(1) 9881-1689 == 8192 = = Vielfaches von Chunk-Größe (2) Scheint nicht, DID explodiert bei Dateioffset 9881, bestätigt durch iconv-Experiment. (3) keine Garantie, dass Stdout gerötet wird, wenn die Ausnahme ausgelöst wird, deshalb haben Sie Argentinien (4) weder lustig-haha noch komisch-eigenartig gesehen; versuchen Sie neutrale Terminologie wie "non-ASCII" (5) spezifizierend encoding = "iso-8559-1" behebt das Problem nur, wenn Sie 100% sicher sind, dass das die richtige Kodierung ist - da diese Kodierung den gesamten 256-Bit-Code verwendet Punkte, jede alte ausführbare Datei oder Datei von verschlüsselten zufälligen Bytes wird "erfolgreich" dekodieren. –

+0

Danke für Ihre technischen Kommentare, es macht jetzt Sinn. (Während ich eine neutrale Terminologie versuche, könntest du vielleicht versuchen, etwas leichter zu werden? Schließlich ist dies eine Kodierungswebsite, keine internationale Diplomatie.) –

1

Können Sie überprüfen, ob UTF-8 gültig ist? Ein Weg, dies zu tun, ist bei this SO question gegeben:

iconv -f UTF-8 /usr/share/dict/words -o /dev/null 

Es gibt auch andere Möglichkeiten, um das Gleiche zu tun.

+0

Er sagt, "iconv: illegale Eingabesequenz an Position 9881" –

Verwandte Themen