Aquí está mi código:
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')
en este punto me sale el mensaje de error
AttributeError: 'str' object has no attribute 'decode'
Python 3 ya no tiene decodificación, ¿estoy en lo cierto? ¿Cómo puedo arreglar esto?
También en:
data = conn.fetch('1', '(BODY[HEADER])')
Estoy seleccionando solo el primer correo electrónico. ¿Cómo selecciono todo?
fuente
decode
atributo, o simplemente detecte la excepción.try: data = data.decode('...') except AttributeError: pass
.Comience con Python 3, toda la cadena es un objeto unicode.
El código anterior es el mismo. Así que creo que deberías eliminar el
.decode('utf-8')
. Porque ya tienes el objeto unicode.fuente
Úselo por este método:
fuente
bytearray(str, 'encoding').decode('another_encoding')
haría el trabajo si necesita decodificaridna
o cualquier otra codificación'\u0159'
imprime exactamente la misma salida. Está confundiendo la sintaxis literal de la cadena con la representación canónica del valor.Para Python3
fuente
No estoy familiarizado con la biblioteca, pero si su problema es que no desea una matriz de bytes, una forma fácil es especificar un tipo de codificación directamente en un molde:
fuente
bytes
Para empezar, no tienen un objeto, ystr(bytes_object, codec)
es solo una ortografía alternativabytes_object.decode(codec)
. Ambos fallan si realmente tienes unstr
lugar.str
. Esta respuesta aún podría ser útil para las personas en el futuro que pueden tener matrices de bytes (este fue el problema que enfrenté cuando originalmente me topé con esta publicación).my_byte_str.decode
existe y funciona, y no arrojará la excepción en la pregunta.Ya está decodificado en Python3, intente directamente, debería funcionar.
fuente
Otras respuestas lo insinúan, pero el problema puede surgir al esperar un objeto de bytes. En Python 3, la decodificación es válida cuando tiene un objeto de bytes de clase. Ejecutar la codificación antes de la decodificación puede "solucionar" el problema, pero es un par de operaciones inútiles que sugieren que el problema se encuentra en la fase inicial.
fuente