/ / Wie gehe ich mit Python 3.x UnicodeDecodeError im E-Mail-Paket um? - Python, Ausnahme, Unicode, Python-3.x, Python-Unicode

Wie gehe ich mit Python 3.x UnicodeDecodeError im Email-Paket um? - Python, Ausnahme, Unicode, Python-3.x, Python-Unicode

Ich versuche, eine E-Mail aus einer Datei wie folgt zu lesen:

import email
with open("xxx.eml") as f:
msg = email.message_from_file(f)

und ich bekomme diesen Fehler:

Traceback (most recent call last):
File "I:faktrealmaildecode.py", line 53, in <module>
main()
File "I:faktrealmaildecode.py", line 50, in main
decode_file(infile, outfile)
File "I:faktrealmaildecode.py", line 30, in decode_file
msg = email.message_from_file(f)  #, policy=mypol
File "C:Python33libemail__init__.py", line 56, in message_from_file
return Parser(*args, **kws).parse(fp)
File "C:Python33libemailparser.py", line 55, in parse
data = fp.read(8192)
File "C:Python33libencodingscp1252.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 1920: character maps to <undefined>

Die Datei enthält eine mehrteilige E-Mail, in der das Teil in utf-8 codiert ist. Der Inhalt oder die Codierung der Datei ist möglicherweise fehlerhaft, aber ich muss trotzdem damit umgehen.

Wie kann ich die Datei lesen, auch wenn sie Unicode-Fehler enthält? Ich kann das Richtlinienobjekt nicht finden compat32 und es scheint keine Möglichkeit zu geben, eine Ausnahme zu behandeln und Python genau dort weiterlaufen zu lassen, wo die Ausnahme aufgetreten ist.

Was kann ich tun?

Antworten:

2 für die Antwort № 1

Ich kann Ihre Nachricht nicht testen, daher weiß ich nicht, ob dies tatsächlich funktioniert, aber Sie können die Zeichenfolge selbst dekodieren:

with open("xxx.eml", encoding="utf-8", errors="replace") as f:
text = f.read()
msg = email.message_from_string(f)

Das wird dir viele Ersatzzeichen bringen, wenn die Nachricht nicht in utf-8 ist. Aber wenn es soweit ist x81 darin ist utf-8 meine Vermutung.


1 für die Antwort № 2

Um eine E-Mail-Nachricht in Python 3 ohne Unicode-Fehler zu analysieren, lesen Sie die Datei im Binärmodus und verwenden Sie die email.message_from_binary_file(f) (oder email.message_from_bytes(f.read())) Methode zum Parsen des Inhalts (siehe Dokumentation des email.parser Moduls).

Hier ist Code, der eine Nachricht auf eine Weise analysiert, die mit Python 2 und 3 kompatibel ist:

import email
with open("xxx.eml", "rb") as f:
try:
msg = email.message_from_binary_file(f)  # Python 3
except AttributeError:
msg = email.message_from_file(f)  # Python 2

(getestet mit Python 2.7.13 und Python 3.6.0)


0 für die Antwort № 3
with open("email.txt","rb") as f:
ascii_txt = f.read().encode("ascii","backslashreplace")

with open("email.txt","w") as f:
f.write(ascii_text)

#now do your processing stuff

Ich bezweifle, dass es der beste Weg ist, damit umzugehen ... aber es ist zumindest ein Weg ...


0 für die Antwort № 4

Eine Methode, die mit Python 3 funktioniert, findet die Codierung und lädt sie mit der richtigen neu.

msg=email.message_from_file(open("file.eml",  errors="replace"))
codes=[x for x in msg.get_charsets() if x!=None]
if len(codes)>=1 :
msg=email.message_from_file(open("file.eml", encoding=codes[0]))

Ich habe es versucht msg.get_charset(), aber es antwortet manchmal None während eine andere Kodierung verfügbar ist, daher die geringfügig beteiligte Kodierungserkennung