'str' 对象没有属性 'decode'。 Python3个错误?

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

这是我的代码:

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全部?

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

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

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

至于您的 fetch() 呼叫,您明确要求仅获取第一条消息。如果要检索更多消息,请使用范围。见 documentation:

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:*').

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

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

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

按此方法使用:

str.encode().decode()

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

>>> my_byte_str
b'Hello World'

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

已经在Python3中解码了,直接试试应该可以。

对于Python3

html = """\u003Cdiv id=\u0022contenedor\u0022\u003E \u003Ch2 class=\u0022text-left m-b-2\u0022\u003EInformaci\u00f3n del veh\u00edculo de patente AA345AA\u003C\/h2\u003E\n\n\n\n \u003Cdiv class=\u0022panel panel-default panel-disabled m-b-2\u0022\u003E\n \u003Cdiv class=\u0022panel-body\u0022\u003E\n \u003Ch2 class=\u0022table_title m-b-2\u0022\u003EInformaci\u00f3n del Registro Automotor\u003C\/h2\u003E\n \u003Cdiv class=\u0022col-md-6\u0022\u003E\n \u003Clabel class=\u0022control-label\u0022\u003ERegistro Seccional\u003C\/label\u003E\n \u003Cp\u003ESAN MIGUEL N\u00b0 1\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EDirecci\u00f3n\u003C\/label\u003E\n \u003Cp\u003EMAESTRO ANGEL D\u0027ELIA 766\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EPiso\u003C\/label\u003E\n \u003Cp\u003EPB\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EDepartamento\u003C\/label\u003E\n \u003Cp\u003E-\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EC\u00f3digo postal\u003C\/label\u003E\n \u003Cp\u003E1663\u003C\/p\u003E\n \u003C\/div\u003E\n \u003Cdiv class=\u0022col-md-6\u0022\u003E\n \u003Clabel class=\u0022control-label\u0022\u003ELocalidad\u003C\/label\u003E\n \u003Cp\u003ESAN MIGUEL\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EProvincia\u003C\/label\u003E\n \u003Cp\u003EBUENOS AIRES\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003ETel\u00e9fono\u003C\/label\u003E\n \u003Cp\u003E(11)46646647\u003C\/p\u003E\n \u003Clabel class=\u0022control-label\u0022\u003EHorario\u003C\/label\u003E\n \u003Cp\u003E08:30 a 12:30\u003C\/p\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n\u003C\/div\u003E \n\n\u003Cp class=\u0022text-center m-t-3 m-b-1 hidden-print\u0022\u003E\n \u003Ca href=\u0022javascript:window.print();\u0022 class=\u0022btn btn-default\u0022\u003EImprim\u00ed la consulta\u003C\/a\u003E \u0026nbsp; \u0026nbsp;\n \u003Ca href=\u0022\u0022 class=\u0022btn use-ajax btn-primary\u0022\u003EHacer otra consulta\u003C\/a\u003E\n\u003C\/p\u003E\n\u003C\/div\u003E"""
print(html.replace("\/", "/").encode().decode('unicode_escape'))

其他答案有点暗示,但问题可能是由于需要一个字节对象。在 Python 3 中,当你有一个 class 字节的对象时解码有效。 运行 先编码后解码可能会 "fix" 问题,但这是一对无用的操作,表明我们上游存在问题。

使用编解码器模块的 open() 读取文件:

import codecs
with codecs.open(file_name, 'r', encoding='utf-8', errors='ignore') as fdata:

这对我有用:

html.replace("\/", "/").encode().decode('unicode_escape', 'surrogatepass')

这类似于 json.loads(html) 行为

如果您在 PyJWT v2.0.0 版本(2020 年 12 月 22 日)后使用 jwt 身份验证登陆此处,您可能希望将 PyJWT 版本冻结到 requirements.txt 文件中的先前版本。

PyJWT==1.7.1

我得到 'str' object has no attribute 'decode' while creating JWT access_token using Flask_JWT_extended包.

为了解决这个问题,我将我的 Flask-JWT-Extended 软件包升级到了 Flask-JWT-Extended==4.1.0

供参考:

请访问此页面:https://flask-jwt-extended.readthedocs.io/en/stable/

在 Python 3 中,这个心智模型非常简单:

  • 编码是将一个str转换成一个bytes对象的过程
  • 解码是将bytes对象转换为str
  • 的过程
┏━━━━━━━┓                ┏━━━━━━━┓
┃       ┃ -> encoding -> ┃       ┃
┃  str  ┃                ┃ bytes ┃
┃       ┃ <- decoding <- ┃       ┃
┗━━━━━━━┛                ┗━━━━━━━┛

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

如果有人在参加 Kaggle 的 Logistic REgre 时遇到同样的错误,这里是解决方案:

logmodel = LogisticRegression(solver='liblinear')

如果您正在使用 Django 和 simple-jwt: 这是您的 100% 解决方案

pip install PyJWT==1.7.1

我的情况可能有点罕见,但我正在使用 django,我的项目是 运行 在本地,但在我部署它时却不是,似乎我遇到了多个依赖项错误,因为我正在做:pip freeze > requirements.txt 这样做解决了问题:

pip3 freeze > requirements.txt

首先安装合适的 JWT

pip3 install PyJWT

然后在你的代码中

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

这对我有用,我想这会对你有所帮助