'str' object n'a pas d'attribut "décoder". Python 3 erreur?
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 point, je reçois le message d'erreur
AttributeError: 'str' object has no attribute 'decode'
Python 3 n'a pas de décoder plus, ai-je le droit? comment puis-je résoudre ce problème?
Aussi, dans:
data = conn.fetch('1', '(BODY[HEADER])')
Je suis en sélectionnant uniquement le 1er mail. Comment puis-je sélectionner tous?
Vous devez vous connecter pour publier un commentaire.
Vous essayez de décoder un objet qui est déjà décodé. Vous avez un
str
, il n'est pas nécessaire de décoder de l'UTF-8 plus.Il suffit de déposer le
.decode('utf-8')
partie:Comme pour votre
fetch()
appel, vous êtes explicitement demandé pour le premier message. Utiliser une gamme si vous voulez récupérer les messages. Voir la la documentation:decode
attribut, ou il suffit de prendre l'exception.try: data = data.decode('...') except AttributeError: pass
.Commencer avec Python 3, toutes les chaînes de caractères unicode objet.
le code avant de le sont de même. Donc, je pense que vous devriez supprimer le
.decode('utf-8')
. Parce que vous avez déjà de l'unicode objet.Utiliser cette Méthode:
bytearray(str, 'encoding').decode('another_encoding')
pour faire le travail si vous avez besoin de décoderidna
ou tout autre codage'\u0159'
imprime exactement la même sortie. Vous confondez la chaîne de la syntaxe littérale avec la représentation canonique de la valeur.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:
bytes
objet pour commencer, etstr(bytes_object, codec)
est juste une autre orthographe pourbytes_object.decode(codec)
. Les deux échouent si vous avez vraiment unstr
à la place.str
déjà. Cette réponse pourrait encore être utile aux gens, dans l'avenir, qui pourraient avoir des tableaux d'octets (c'était la question que j'ai rencontrés quand je suis tombé sur ce post).my_byte_str.decode
existe et fonctionne, et de ne pas jeter l'exception de la question.Il s déjà décodé en Python3, Essayer directement, il devrait fonctionner.