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