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! :)