Seite 1 von 1
Exception
Verfasst: Samstag 28. April 2012, 22:38
von MarcelF6
Guten Abend liebe Leute
Ich habe momentan folgenden Code (Ausschnitt):
Code: Alles auswählen
try:
in_file = codecs.open(in_name, 'r', in_enc)
try:
content = in_file.read()
except IOError:
print sys.exit('The file cannot be read.')
in_file.close()
except IOError:
print sys.exit('The file cannot be opened.')
Meine Frage ist: Wie kann ich die Exception abfangen, falls das encoding der input-Datei falsch angegeben wird? Also wie kann ich erreichen, dass python "merkt", dass das encoding nicht stimmt und dann die entsprechende Exception wirft (und nicht eine andere...)?
Danke für die Hilfe,
Marcel
Re: Exception
Verfasst: Samstag 28. April 2012, 22:58
von BlackJack
@MarcelF6: Probiers doch einfach mal aus welche Ausnahme Du bekommst wenn die angegebene Kodierung nicht mit dem Inhalt übereinstimmt.
Wobei das nicht in allen Fällen/Kombinationen zu einer Ausnahme führen wird, denn oft kann man das per Programm einfach nicht erkennen.
Re: Exception
Verfasst: Samstag 28. April 2012, 23:35
von MarcelF6
Falls was mit dem Encoding nicht stimmt, bekomme ich einfach ein UnicodeDecodeError. Den kann ich natürlich abfangen. Dann habe ich das mit der Eingabe zwar geprüft. Aber wie kann ich noch checken, dass das angegebene Ausgabeformat dann auch alle Zeichen des Eingabetextes darstellen kann? (Also dass es kein "schlechteres" Encoding als das Eingabeencoding ist)?
Re: Exception
Verfasst: Samstag 28. April 2012, 23:51
von BlackJack
@MarcelF6: Das würde zu einem `UnicodeEncodeError` führen. In *die* Richtung sogar *zuverlässig*.
Re: Exception
Verfasst: Sonntag 29. April 2012, 00:14
von MarcelF6
Dankeschön

Noch zum Encode: Wenn ich ein Text habe, der UTF-8 kodiert ist, ich aber latin-1 eingebe. Dann müsste das Programm eigentlich latin-1 auf utf-8 ändern. Da aber kein EncodeError kommt, wird nichts geändert. Wieso reklamiert python da nicht?
Re: Exception
Verfasst: Sonntag 29. April 2012, 00:42
von cofi
Du meinst wohl einen _Decode_Error. Ohne zu tief in die Encoding-Details zu gehen: Latin1 kann UTF-8 Daten problemlos dekodieren, aber eben nicht zu den urspruenglichen Werten:
Code: Alles auswählen
In [4]: u'ξ'.encode('utf8').decode('latin1')
Out[4]: u'\xce\xbe'
In [5]: print _
ξ
Re: Exception
Verfasst: Sonntag 29. April 2012, 10:22
von MarcelF6
Ja, genau das passiert. Und genau das ist der "Fehler", den ich eigentlich abfangen möchte. Ist das also gar nicht möglich?
Oke, jetzt bin ich etwas verwirrt:
Es ist doch ein decode-Fehler, wenn der output-text ein zu "schwaches" encoding hat (also nicht alle Zeichen darstellen kann) und ein encode-Fehler, wenn ein zu schwaches input-encoding angegeben wird. Oder ist es gerade umgekehrt?
Re: Exception
Verfasst: Sonntag 29. April 2012, 10:29
von cofi
Nein das Abfangen ist nicht moeglich. Siehe oben: Fuer den Latin1 Codec sind das sinnvolle Bytewerte, also kein Fehler.
Encode: Unicode -> Bytes
Decode: Bytes -> Unicode
Encode Error koennen nur bei ersterem, Decode nur bei letzterem passieren. Fuer den EncodeError passt deine Sicht noch, fuer den DecodeError musst du sie anpassen: Ein DecodeError tritt dann auf, wenn der Codec ein Bytemuster dekodieren soll, das nicht gueltig ist.
Und das tritt auch dann auf, wenn der Codec eine innere Struktur hat, wie es bei UTF-8 der Fall ist um "seltenere" Zeichen darszustellen.
Re: Exception
Verfasst: Sonntag 29. April 2012, 10:39
von MarcelF6
Ok, ich danke dir vielmals!
