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

'str' object has no attribute 'decode'. Python 3 error?

这是我的代码:

1
2
3
4
5
6
7
8
9
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')

此时,我收到错误消息

1
AttributeError: 'str' object has no attribute 'decode'

python 3不再解码了,对吗?我怎么修这个?

此外,在:

1
data = conn.fetch('1', '(BODY[HEADER])')

我只选择第一封电子邮件。如何全选?


您正在尝试解码已解码的对象。你有一个str,不再需要从utf-8解码。

只需去掉.decode('utf-8')部分:

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

至于你的fetch()电话,你只是明确要求第一条信息。如果要检索更多消息,请使用范围。请参阅文档:

The message_set options to commands below is a string specifying one or more messages to be acted upon. It may be a simple message number ('1'), a range of message numbers ('2:4'), or a group of non-contiguous ranges separated by commas ('1:3,6:9'). A range can contain an asterisk to indicate an infinite upper bound ('3:*').


从python 3开始,所有字符串都是unicode对象。

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

之前的代码是相同的。所以我认为你应该把.decode('utf-8')取下来。因为你已经得到了unicode对象。


按此方法使用:

1
str.encode().decode()


我不熟悉这个库,但是如果您的问题是不需要字节数组,一个简单的方法是在转换中直接指定编码类型:

1
2
3
4
5
>>> my_byte_str
b'Hello World'

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


它已经在python3中解码,直接尝试它应该可以工作。