l'objet' str 'n'a pas d'attribut 'decode'. Erreur Python 3?
Voici mon code:
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('example@gmail.com', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')
À ce stade, je reçois 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ésoudre ce problème?
Aussi, dans:
data = conn.fetch('1', '(BODY[HEADER])')
Je ne sélectionne que le 1er e-mail. Comment sélectionner tout?
5 réponses
Vous essayez de décoder un objet qui est déjà décodé. Vous avez un str
, Il n'est plus nécessaire de décoder à partir de UTF-8.
Déposez simplement la partie .decode('utf-8')
:
header_data = data[1][0][1]
Quant à votre appel fetch()
, vous ne demandez explicitement que le premier message. Utilisez une plage si vous souhaitez récupérer plus de messages. Voir la documentation :
Le message_set options des commandes ci-dessous est une chaîne spécifiant un ou plusieurs messages à agir sur. Il peut s'agir d'un simple numéro de message (
'1'
), d'une plage de numéros de message ('2:4'
) ou d'un groupe de plages non contiguës séparées par des virgules ('1:3,6:9'
). Une plage peut contenir un astérisque pour indiquer une limite supérieure infinie ('3:*'
).
Commence par Python 3, toute la chaîne est un objet unicode.
a = 'Happy New Year' # Python 3
b = unicode('Happy New Year') # Python 2
Le code avant sont les mêmes. Donc, je pense que vous devriez supprimer le .decode('utf-8')
. Parce que vous avez déjà l'objet unicode.
Je ne suis pas familier avec la bibliothèque, mais si votre problème est que vous ne voulez pas un tableau d'octets, un moyen simple est de spécifier un type de codage droite dans le plâtre:
>>> my_byte_str
b'Hello World'
>>> str(my_byte_str, 'utf-8')
'Hello World'
Il est déjà décodé en Python3, essayez directement cela devrait fonctionner.