'str'对象没有属性'decode'。 Python 3错误?

这是我的代码:

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])') 

我只select第一封电子邮件。 我如何select全部?

如果我删除.decode(utf-8')就像你build议的一样,我得到的错误信息:

 TypeError: initial_value must be str or none, not bytes 

您正在尝试解码已经解码的对象。 你有一个str ,没有必要再从UTF-8解码。

简单地删除.decode('utf-8')部分:

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

至于你的fetch()调用,你明确地要求第一个消息。 如果您想要检索更多邮件,请使用范围。 请参阅文档 :

以下命令的message_set选项是一个string,用于指定一个或多个要处理的消息。 它可以是一个简单的消息号码( '1' ),一个消息号码范围( '2:4' ),或者一组以逗号分隔的不连续范围( '1:3,6:9' )。 范围可以包含星号来表示无限上限( '3:*' )。

从Python 3开始,所有string都是unicode对象。

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

之前的代码是一样的。 所以我认为你应该删除.decode('utf-8') 。 因为你已经得到了unicode对象。

通过此方法使用它:

 str.encode().decode() 

我不熟悉库,但如果你的问题是你不想要一个字节数组,一个简单的方法是在一个强制转换中直接指定一个编码types:

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