Aqui está o meu 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')
Neste ponto, recebo a mensagem de erro
AttributeError: 'str' object has no attribute 'decode'
Python 3 não tem mais decodificação, estou certo? Como posso consertar isso?
Também em:
data = conn.fetch('1', '(BODY[HEADER])')
Estou selecionando apenas o 1º email. Como seleciono tudo?
fonte
decode
atributo ou apenas pegue a exceção.try: data = data.decode('...') except AttributeError: pass
.Comece com o Python 3, toda a string é um objeto unicode.
o código anterior é o mesmo. Então eu acho que você deve remover o
.decode('utf-8')
. Porque você já recebeu o objeto unicode.fonte
Use-o por este método:
fonte
bytearray(str, 'encoding').decode('another_encoding')
iria fazer o trabalho se você precisa para decodificaridna
ou qualquer outra codificação'\u0159'
imprime exatamente a mesma saída. Você está confundindo a sintaxe literal da cadeia de caracteres com a representação canônica do valor.Para Python3
fonte
Não estou familiarizado com a biblioteca, mas se o seu problema é que você não deseja uma matriz de bytes, uma maneira fácil é especificar um tipo de codificação diretamente em uma conversão:
fonte
bytes
objeto para começar estr(bytes_object, codec)
são apenas uma grafia alternativabytes_object.decode(codec)
. Ambos falham se você realmente tiver umstr
.str
já tem uma . Essa resposta ainda pode ser útil para pessoas no futuro que possam ter matrizes de bytes (esse foi o problema que eu enfrentei quando me deparei com essa postagem originalmente).my_byte_str.decode
existe e funciona, e não lançará a exceção na pergunta.Ele já está decodificado no Python3. Tente diretamente, ele deve funcionar.
fonte
Outras respostas sugerem isso, mas o problema pode surgir da expectativa de um objeto de bytes. No Python 3, a decodificação é válida quando você tem um objeto de bytes de classe. A execução da codificação antes da decodificação pode "consertar" o problema, mas é um par inútil de operações que sugere o problema nos upstream.
fonte