Voici mon 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')
à ce stade, j'obtiens le message d'erreur
AttributeError: 'str' object has no attribute 'decode'
Python 3 n'a plus de décodage, n'est-ce pas? Comment puis-je réparer cela?
Aussi dans:
data = conn.fetch('1', '(BODY[HEADER])')
Je sélectionne uniquement le 1er e-mail. Comment tout sélectionner?
la source
decode
attribut, ou attrapez simplement l'exception.try: data = data.decode('...') except AttributeError: pass
.Commencez par Python 3, toute la chaîne est un objet unicode.
le code avant est le même. Je pense donc que vous devriez supprimer le fichier
.decode('utf-8')
. Parce que vous avez déjà obtenu l'objet unicode.la source
Utilisez-le par cette méthode:
la source
bytearray(str, 'encoding').decode('another_encoding')
ferait le travail si vous avez besoin de décoderidna
ou de tout autre encodage'\u0159'
imprime exactement la même sortie. Vous confondez la syntaxe littérale de chaîne avec la représentation canonique de la valeur.Pour Python3
la source
Je ne suis pas familier avec la bibliothèque, mais si votre problème est que vous ne voulez pas de tableau d'octets, un moyen simple est de spécifier un type d'encodage directement dans un cast:
la source
bytes
objet pour commencer et nestr(bytes_object, codec)
sont qu'une orthographe alternativebytes_object.decode(codec)
. Les deux échouent si vous avez vraiment unstr
fichier.str
déjà un . Cette réponse pourrait encore être utile aux personnes à l'avenir qui pourraient avoir des tableaux d'octets (c'était le problème auquel j'ai été confronté lorsque je suis tombé sur ce post).my_byte_str.decode
existe et fonctionne, et ne jettera pas l'exception dans la question.Il est déjà décodé en Python3, essayez directement cela devrait fonctionner.
la source
D'autres réponses y font allusion, mais le problème peut provenir de l'attente d'un objet bytes. Dans Python 3, le décodage est valide lorsque vous avez un objet d'octets de classe. Lancer l'encodage avant le décodage peut "résoudre" le problème, mais c'est une paire d'opérations inutiles qui suggère le problème en amont.
la source