Hier ist mein Code:
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('[email protected]', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')
An dieser Stelle erhalte ich die Fehlermeldung
AttributeError: 'str' object has no attribute 'decode'
Python 3 hat keine Dekodierung mehr, habe ich recht? Wie kann ich das beheben?
Auch in:
data = conn.fetch('1', '(BODY[HEADER])')
Ich wähle nur die 1. E-Mail aus. Wie wähle ich alle aus?
quelle
decode
Attribut oder fangen Sie einfach die Ausnahme ab.try: data = data.decode('...') except AttributeError: pass
.Beginnen Sie mit Python 3, alle Zeichenfolgen sind Unicode-Objekte.
Der vorherige Code ist derselbe. Also ich denke du solltest das entfernen
.decode('utf-8')
. Weil Sie das Unicode-Objekt bereits erhalten haben.quelle
Verwenden Sie es mit dieser Methode:
quelle
bytearray(str, 'encoding').decode('another_encoding')
würde den Job machen, wenn Sie dekodieren müssenidna
oder eine andere Kodierung'\u0159'
druckt genau die gleiche Ausgabe. Sie verwechseln die String-Literal-Syntax mit der kanonischen Darstellung des Werts.Für Python3
quelle
Ich bin mit der Bibliothek nicht vertraut, aber wenn Ihr Problem darin besteht, dass Sie kein Byte-Array möchten, können Sie auf einfache Weise einen Codierungstyp direkt in einer Besetzung angeben:
quelle
bytes
Objekt undstr(bytes_object, codec)
sind nur eine alternative Schreibweise fürbytes_object.decode(codec)
. Beide scheitern, wenn Siestr
stattdessen wirklich eine haben .str
. Diese Antwort könnte auch in Zukunft für Personen nützlich sein, die möglicherweise Byte-Arrays haben (dies war das Problem, mit dem ich konfrontiert war, als ich ursprünglich auf diesen Beitrag gestoßen bin).my_byte_str.decode
existiert und funktioniert und die Ausnahme nicht in die Frage werfen wird.Es ist bereits in Python3 dekodiert. Versuchen Sie es direkt, es sollte funktionieren.
quelle
Andere Antworten deuten darauf hin, aber das Problem kann durch das Erwarten eines Byte-Objekts entstehen. In Python 3 ist die Dekodierung gültig, wenn Sie ein Objekt mit Klassenbytes haben. Das Ausführen der Codierung vor der Decodierung kann das Problem "beheben", aber es ist ein nutzloses Operationspaar, das das Problem uns vorgelagert vorschlägt.
quelle