这是我的代码:


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'对象没有'decode'属性

Python 3不再有str.decode(),所以我如何解决这个问题?


当前回答

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

>>> my_byte_str
b'Hello World'

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

其他回答

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

只需删除.decode('utf-8')部分:

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

首先安装合适的JWT

pip3 install PyJWT

然后在代码中

token.encode().decode('UTF-8')

这对我有用,我想这对你也有帮助

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

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

上面的说明是一样的。所以我认为你应该删除.decode('utf-8')部分,因为你已经有了一个unicode对象。

我的情况可能有点罕见,但我正在使用django和我的项目在本地运行,但当我部署它时,似乎我得到了多个依赖错误,因为我正在做:pip冻结> requirements.txt这样做修复了这个问题:

pip3 freeze > requirements.txt

在Python 3中,这个心智模型非常直接:

编码是将str对象转换为bytes对象的过程 解码是将bytes对象转换为str对象的过程

┏━━━━━━━┓                ┏━━━━━━━┓
┃       ┃ -> encoding -> ┃       ┃
┃  str  ┃                ┃ bytes ┃
┃       ┃ <- decoding <- ┃       ┃
┗━━━━━━━┛                ┗━━━━━━━┛

在你的例子中,你调用data.decode("UTF-8"),但是变量已经是一个str对象并且已经解码。所以只要直接引用数据,如果字符串是你需要的。