Вот мой код:
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')
в этот момент я получаю сообщение об ошибке
AttributeError: 'str' object has no attribute 'decode'
У Python 3 больше нет декодирования, я прав? Как я могу это исправить?
Также в:
data = conn.fetch('1', '(BODY[HEADER])')
Я выбираю только 1-е письмо. Как выбрать все?
источник
decode
атрибут, или просто перехватите исключение.try: data = data.decode('...') except AttributeError: pass
,Начните с Python 3, вся строка является объектом Unicode.
код перед тем же. Поэтому я думаю, что вы должны удалить
.decode('utf-8')
. Потому что вы уже получили объект Unicode.источник
Используйте это этим методом:
источник
bytearray(str, 'encoding').decode('another_encoding')
будет делать эту работу, если вам нужно декодироватьidna
или любую другую кодировку'\u0159'
печатает точно такой же вывод. Вы путаете синтаксис строкового литерала с каноническим представлением значения.Для Python3
источник
Я не знаком с библиотекой, но если ваша проблема в том, что вам не нужен байтовый массив, один простой способ - указать тип кодировки прямо в приведении:
источник
bytes
объекта для начала, иstr(bytes_object, codec)
это просто альтернативное написаниеbytes_object.decode(codec)
. Оба не удастся, если у вас действительно естьstr
вместо.str
. Этот ответ все еще может быть полезен людям в будущем, которые могут иметь байтовые массивы (с этой проблемой я столкнулся, когда впервые наткнулся на этот пост).my_byte_str.decode
существует и работает, и не будет бросать исключение в вопросе.Он уже декодирован в Python3, попробуйте напрямую, он должен работать.
источник
Другие ответы как бы намекают на это, но проблема может возникнуть из-за ожидания байтового объекта. В Python 3 декодирование допустимо, когда у вас есть объект байтов класса. Выполнение кодирования перед декодированием может «исправить» проблему, но это бесполезная пара операций, которые предлагают проблему, стоящую перед нами.
источник