ул. '' объект не имеет атрибут 'расшифровать'. Ошибка в Python 3?
вот мой код:
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')
на данный момент я получаю сообщение об ошибке
AttributeError: 'str' object has no attribute 'decode'
Python 3 больше не имеет декодирования, я прав? как я могу это исправить?
также в:
data = conn.fetch('1', '(BODY[HEADER])')
Я выбираю только 1-е письмо. Как мне выбрать все?
5 ответов:
вы пытаетесь декодировать объект, который уже декодированный. У вас есть
str, больше нет необходимости декодировать из UTF-8.просто удалить
.decode('utf-8')детали:header_data = data[1][0][1]Что касается вашего
fetch()вызов, вы явно просите только первое сообщение. Используйте диапазон, если вы хотите получить больше сообщений. Смотрите документация:The message_set параметры для команд ниже строка, указывающая одно или несколько сообщений, с которыми нужно действовать. Это может быть простой номер сообщения (
'1'), диапазон номеров сообщений ('2:4'), или группа несмежных диапазонов, разделенных запятыми ('1:3,6:9'). Диапазон может содержать звездочку, указывающую на бесконечную верхнюю границу ('3:*').
начните с Python 3, вся строка является объектом unicode.
a = 'Happy New Year' # Python 3 b = unicode('Happy New Year') # Python 2код перед тем же. Поэтому я думаю, что вы должны удалить
.decode('utf-8'). Потому что вы уже получили объект unicode.
Я не знаком с библиотекой, но если ваша проблема заключается в том, что вам не нужен массив байтов, один простой способ-указать тип кодировки прямо в приведении:
>>> my_byte_str b'Hello World' >>> str(my_byte_str, 'utf-8') 'Hello World'
Comments