Seite 1 von 1

Python 3: UnicodeDecodeError bei file.readline()

Verfasst: Freitag 3. April 2009, 14:46
von fantomas
Hallo,

die file.readline() Funktion macht mir bei Python 3 Probleme.

Wenn ich z.B. folgende Code-Zeilen habe...

Code: Alles auswählen

f = open("text.txt")
for line in f:
      print(line)  # bzw. print line
.. dann läuft das mit 2.6 wunderbar durch, aber mit Python 3 gibt es manchmal Probleme, die dann so aussehen:

Traceback (most recent call last):
File "C:\...\test.py", line 13, in <module>
for line in fp:
File "C:\Python30\lib\io.py", line 1744, in __next__
line = self.readline()
File "C:\Python30\lib\io.py", line 1817, in readline
while self._read_chunk():
File "C:\Python30\lib\io.py", line 1565, in _read_chunk
self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
File "C:\Python30\lib\io.py", line 1299, in decode
output = self.decoder.decode(input, final=final)
File "C:\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 1105: character maps to <undefined>

Die Zeilen, über die Python stolpert, unterscheiden sich in nichts vom restlichen Inhalt der Datei. Also keine Umlaute oder irgendwelche wirren Zeichen..

Hat jemand eine Idee, wo der Fehler steckt? Danke vielmals!

P.S.: In einer früheren Version dieses Beitrages stand oben im Code print(x) anstatt print(line). Das ist natürlich Quatsch, sorry dafür..

Verfasst: Freitag 3. April 2009, 15:06
von b.esser-wisser
Man kann Python-programme nicht einfach unter 2.x und 3.x laufen lassen, jag dein programm zumindest durch "2to3.py", das sollte solche Sachen finden und korrekt beheben.

hth, Jörg
ps.: ich wollte wirklich nicht "rtfm" schreiben - aber du kannst nicht in Python 3 programmieren, wenn du nur die 2.x-Dokumentation gelesen hast

Verfasst: Freitag 3. April 2009, 19:38
von fantomas
Hallo,

ich versuche es noch einmal, denn ich kann mir nicht ganz vorstellen, dass es an falscher Portierung von 2.6 auf 3 liegt.

In Python 2.6 sieht das Programm so aus:

Code: Alles auswählen

f = open("text.txt")
for line in f:
   print line
Wie gesagt, laeuft alles wunderbar. Nachdem ich 2to3.py ueber das Programm habe laufen lassen, sieht es so aus:

Code: Alles auswählen

f = open("text.txt")
for line in f:
   print(line)
Nun haengt sich das Programm bei einigen Textdateien (und dort bei bestimmten Zeilen) mit folgender Fehlermeldung auf:

Traceback (most recent call last):
File "C:\...\test.py", line 2, in <module>
for line in f:
File "C:\Python30\lib\io.py", line 1744, in __next__
line = self.readline()
File "C:\Python30\lib\io.py", line 1817, in readline
while self._read_chunk():
File "C:\Python30\lib\io.py", line 1565, in _read_chunk
self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
File "C:\Python30\lib\io.py", line 1299, in decode
output = self.decoder.decode(input, final=final)
File "C:\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 624: character maps to <undefined>


Tut mir sehr Leid, wenn ich den Wald for lauter Baeumen nicht sehe (oder ich in der Doku etwas ueberlesen habe), aber ich waere fuer Hinweise dankbar!

Verfasst: Freitag 3. April 2009, 20:58
von b.esser-wisser
Die Umsetzung macht nicht das gleiche, wie die 2.x Version, denn open() liefert in Python 3 ein fileobject, das unicode()-Objekte liefert (das ist in python 3 der Standard für Texte), dazu müssen die bytes in der Datei decode't werden - etwas, was dein 2.x-programm nicht macht (Vermutlich der größte Unterschied zwischen 2 und 3).

Sogar die Fehlermeldung, die du schon mehrfach gepostet hast, sagt, dass in deiner "Text"-Datei Zeichen ("\x81") stehen, die es im cp1252-encoding - das Standardencoding für deutschsprachiges Windows - nicht gibt, d.h. die Datei enthält keinen bzw. nicht nur Text.

Und lass als Anfänger die Finger von Python 3, wenn du nicht mit dem Wörterbuch in der Hand das Tutorial durchgehst bzw. durchgehen willst (deutsche Literatur dazu gibt es vermutlich gar nicht).

hth, Jörg

Verfasst: Freitag 3. April 2009, 21:11
von derdon
Es gibt auch Python-Anfänger, die Englisch können :roll:

Verfasst: Freitag 3. April 2009, 22:15
von Leonidas
Man könnte, rein theoretisch auch einfach das Encoding der Textdatei angeben. Übrigens teile ich die Ansicht von b.esser-wisser dass python 3 nicht für Anfänger ist nicht. Klar, man muss die Unterschiede kennen und sich bischen mit Unicode auseinandersetzen, aber wir wollen mal nicht übertreiben, selbst Anfänger kriegen sowas hin.

Verfasst: Freitag 3. April 2009, 23:21
von numerix
b.esser-wisser hat geschrieben:Und lass als Anfänger die Finger von Python 3 [...] (deutsche Literatur dazu gibt es vermutlich gar nicht).
Was den ersten Teil angeht, so stimme ich Leonidas zu.

Was den zweiten Teil angeht, hätte ein kurzer Blick bei Amazon dir gezeigt, dass deine Vermutung nicht stimmt.

Verfasst: Freitag 3. April 2009, 23:30
von fantomas
Stimmt, einige Dateien enthalten anscheinend auch Nicht-Text. Habe ich vorher nicht geglaubt, da der Editor diese Stellen einfach uebersprungen hat. Sorry.