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