Exception

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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
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.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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)?
BlackJack

@MarcelF6: Das würde zu einem `UnicodeEncodeError` führen. In *die* Richtung sogar *zuverlässig*.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 _
ξ
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Ok, ich danke dir vielmals! :)
Antworten