Python 3: UnicodeDecodeError bei file.readline()

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
fantomas
User
Beiträge: 5
Registriert: Freitag 6. Februar 2009, 13:18

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..
Zuletzt geändert von fantomas am Freitag 3. April 2009, 15:19, insgesamt 2-mal geändert.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
fantomas
User
Beiträge: 5
Registriert: Freitag 6. Februar 2009, 13:18

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!
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Es gibt auch Python-Anfänger, die Englisch können :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
fantomas
User
Beiträge: 5
Registriert: Freitag 6. Februar 2009, 13:18

Stimmt, einige Dateien enthalten anscheinend auch Nicht-Text. Habe ich vorher nicht geglaubt, da der Editor diese Stellen einfach uebersprungen hat. Sorry.
Antworten