2015-02-18 3 views
59

Вот мой код:Объект 'str' не имеет атрибута 'decode'. Ошибка 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-й по электронной почте. Как выбрать все?

+4

@ jamesjames94: Пожалуйста, держите свои сообщения только на одном ** вопросе. Не продолжайте распространяться с новыми проблемами, вместо этого задайте новый вопрос. –

ответ

59

Вы пытаетесь декодировать объект, который уже декодирован. У вас есть str, нет необходимости расшифровывать его с UTF-8.

Просто падение .decode('utf-8') часть:

header_data = data[1][0][1] 

Как для fetch() вызова, вы явно прося только первое сообщение. Используйте диапазон, если вы хотите получить больше сообщений. ВИДЕТЬ documentation:

The message_set опции ниже команды является строка, определяющая одно или несколько сообщений, которые необходимо осуществлять на. Это может быть простой номер сообщения ('1'), диапазон номеров сообщений ('2:4') или группа несмежных диапазонов, разделенных запятыми ('1:3,6:9'). Диапазон может содержать звездочку, указывающую бесконечную верхнюю границу ('3:*').

13

Начинать с Python 3, вся строка является unicode-объектом.

a = 'Happy New Year' # Python 3 
    b = unicode('Happy New Year') # Python 2 

код до того же. Поэтому я думаю, вы должны удалить .decode('utf-8'). Потому что вы уже получили объект unicode.

4

Используйте его с помощью этого метода:

str.encode().decode() 
+0

'bytearray (str, 'encoding'). Decode ('another_encoding')' будет выполнять задание, если вам нужно декодировать 'idna' или любую другую кодировку – Alex

+0

Это бесполезно. Вы кодируете UTF-8, а затем декодируете результирующие байты как UTF-8, заканчивая тем, с чего вы начали. Вы держите процессор теплым без каких-либо других преимуществ. –

0

Я не знаком с библиотекой, но если ваша проблема в том, что вы не хотите, массив байтов, один простой способ, чтобы указать тип кодировки прямо в литье:

>>> my_byte_str 
b'Hello World' 

>>> str(my_byte_str, 'utf-8') 
'Hello World' 
+0

У них нет объекта 'bytes', и' str (bytes_object, codec) 'является просто альтернативным написанием для' bytes_object.decode (codec) '. Оба не работают, если у вас действительно есть 'str'. –

+0

Вы правы, этот конкретный вопрос уже имеет 'str'. Этот ответ по-прежнему может быть полезен людям в будущем, которые могут иметь байтовые массивы (это была проблема, с которой я столкнулся, когда я впервые наткнулся на этот пост). – Broper

+0

Я не уверен, как вы наткнулись на это сообщение, потому что 'my_byte_str.decode' существует и работает и не будет генерировать исключение в вопросе. –