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?

85
demandé sur Martijn Pieters 2015-02-18 15:20:05

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:*').

84
répondu Martijn Pieters 2015-02-18 12:50:07

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.

16
répondu Neo Ko 2015-02-18 12:44:50

Utilisez-le par cette méthode:

str.encode().decode()
8
répondu Alireza 2017-03-27 23:08:01

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'
1
répondu Broper 2017-11-22 04:26:49

Il est déjà décodé en Python3, essayez directement cela devrait fonctionner.

0
répondu Aditya 2018-07-11 05:33:10