Python3: UnicodeDecodeError: 'utf8' codec can't decode byte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Ich hab die Doku zu Python3 gelesen und auch die Änderungen im Bezug auf die vorherigen. Ich hab auch den anderen Thread hier bezüglich dieser Problematik gelesen http://www.python-forum.de/topic-18421. ... ecodeerror

Helfen tut mir das alles nicht.
Ich hab eine Datei unbekannter Kodierung und versuche diese einzulesen:

Code: Alles auswählen

f = open('C:\\4.DAT','r',None,'utf_8');
f.readline()
Liefern tut mir der Spass
Traceback (most recent call last):
File "test.py", line 10, in <module>
f.readline()
File "C:\Programme\Python30\lib\io.py", line 1813, in readline
while self._read_chunk():
File "C:\Programme\Python30\lib\io.py", line 1562, in _read_chunk
self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
File "C:\Programme\Python30\lib\io.py", line 1295, in decode
output = self.decoder.decode(input, final=final)
File "C:\Programme\Python30\lib\codecs.py", line 300, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 107: unexpected code byte
Ich weiß beim besten Willen nicht, was ich noch tun kann. codes ist ja laut Changelog bei open (codecs.open) nicht mehr notwendig.

Was kann man da noch tun, ich habe ne Menge Kodierungen durchprobiert, ascii, die cp varianten und alle utf Möglichkeiten.

Mich wundert extrem, warum selbst im unicode etwas nicht richtig erkannt wird. Soweit ich das weiß, ist es nicht utf-16 oder 32

Edit: Liefert den selben Fehler:

Code: Alles auswählen

f = open('C:\\4.DAT','rb');
f.readline().decode('utf8');
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Wenn die Codierung von deiner Datei auf einem Windows-pc (zumindest dir) unbekannt ist, ist es mit sehr hoher Wahrscheinlichkeit kein UTF-8. Probier mal "cp1252" als Encoding, falls der PC auf "Deutsch/Deutschland" eingestellt ist. Falls nicht hilft dir Google o.ä. bestimmt gerne weiter ;)

hth, Jörg
ps.: Wenn das gar keine Textdatei ist (könnte bei ".dat" ja sein), hilft dir auch kein Encoding und du musst dir was anderes ausdenken. Aber in den Docs steht bestimmt was zu Bytestrings bzw. Bytestreams...
Zuletzt geändert von b.esser-wisser am Sonntag 19. April 2009, 13:23, insgesamt 1-mal geändert.
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Es ist Deutschland eingestellt.

Code: Alles auswählen

f = open('4.DAT','r',None,'cp1252');
Liefert
Traceback (most recent call last):
File "test.py", line 10, in <module>
print(str(i) +" - " +f.readline().strip())
File "C:\Programme\Python30\lib\io.py", line 1813, in readline
while self._read_chunk():
File "C:\Programme\Python30\lib\io.py", line 1562, in _read_chunk
self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
File "C:\Programme\Python30\lib\io.py", line 1295, in decode
output = self.decoder.decode(input, final=final)
File "C:\Programme\Python30\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 107: character maps to <undefined>
Jetzt weiß er nicht, wohin er mappen soll. Inhalt der Datei ist auf jeden Fall deutsch.

Hier ist im Übrigen das Zeichen:
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Wer Interesse hat, hier ist die Datei: http://rapidshare.com/files/223200806/foo.dat.html
Das unbekannte Zeichen ist ein ü, die Datei ein paar Bytes groß
lunar

Rapidshare für ein paar Bytes ist – nun ja – nicht gerade eine sinnvolle Wahl. Nicht jeder mag Rapidshare. Du erreichst in diesem Forum bestimmt mehr Leute, wenn du die fragliche Datei in einem normalen NoPaste-Service wie dem Lodgeit veröffentlichst.
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Hab ich mit absicht gemacht, weil ich mir nicht sicher bin, wie das Copy und Paste mit der Kodierung umgehen wird: http://paste.pocoo.org/show/113198/
lunar

Seikilos hat geschrieben:Hab ich mit absicht gemacht, weil ich mir nicht sicher bin, wie das Copy und Paste mit der Kodierung umgehen wird: http://paste.pocoo.org/show/113198/
Stimmt, daran hatte ich gar nicht gedacht ... das Paste stimmt auch nicht mit der ursprünglichen Datei überein :oops:

Wie dem auch sei, deine Datei ist "cp850"-kodiert.
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Klappt!
Danke! Wie hast du es rausgefunden?
lunar

Seikilos hat geschrieben:Wie hast du es rausgefunden?
Ich habe mir die tatsächlichen Bytewerte mit "od" angesehen. An dessen Ausgabe war zu sehen, dass Die Datei weder UTF-8- (das wäre unter Windows sowieso ungewöhnlich) noch UTF-16-kodiert war, da diese Kodierungen "ü" mit zwei Bytes darstellen, deine Datei aber an dieser Stelle nur ein Byte enthielt.

Da die restlichen Buchstaben ASCII kodiert waren, "file" "Non-ISO extended ASCII-text" ausgab und die Datei anscheinend unter Windows erstellt wurde, lag es nahe, dass eine Codepage-Variante im Spiel war. Diese Kodierungen sind ASCII-kompatibel, unterscheiden sich aber Bytes größer 127 von den standardisierten ISO-Varianten. Für den westeuropäischen Sprachraum gibt es zwei ehemals verbreitete Codepages, nämlich cp1252 und cp850. Ersteres hattest du ja bereits ausgeschlossen, also blieb nur cp850. Ein Blick auf die Zeichentabelle bei Wikipedia hat dann auch bestätigt, dass das Byte "0x81" in cp850 dem "ü" entspricht.
Zuletzt geändert von lunar am Sonntag 19. April 2009, 14:42, insgesamt 1-mal geändert.
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Nich schlecht :) Letzte Frage: Was ist od?
lunar

Seikilos hat geschrieben:Nich schlecht :) Letzte Frage: Was ist od?
Ein Unix-Kommandozeilen-Programm, welches Dateien in diversen Darstellungen ausgeben kann, u.a. oktal, hexadezimal oder als ASCII-Zeichen. Ob es das auch für Windows gibt, weiß ich nicht. Allerdings tut es ein normaler Hexeditor auch.
Seikilos
User
Beiträge: 11
Registriert: Sonntag 19. April 2009, 12:16

Ach!
Hat meine Ubuntu Kiste ja auch :)
Antworten