ChatGPT解决这个技术问题 Extra ChatGPT

“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])')

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


M
Martijn Pieters

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

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

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

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

下面命令的 message_set 选项是一个字符串,指定要处理的一条或多条消息。它可能是一个简单的消息编号 ('1')、一个消息编号范围 ('2:4') 或一组用逗号分隔的不连续范围 ('1:3,6:9')。一个范围可以包含一个星号来表示一个无限的上限('3:*')。


有没有一种简单的方法可以有条件地做到这一点? (如果消息被编码,我只想解码。)
@devinbost:在 Python 3 中?测试对象类型或 decode 属性,只是捕获异常。 try: data = data.decode('...') except AttributeError: pass
@devinbost:但是,您通常最好在靠近数据源的地方进行解码,您通常会确切地知道自己拥有什么。
M
Mathieu Rollet

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

PyJWT==1.7.1

给这个人一个勋章!!!!这是我们环境 rest_framework_simplejwt 包中的依赖项,并导致了问题。
不是一个安全的解决方案:请参阅影响 PyJWT 1.x 版本的 CVE-2022-29217:github.com/jpadilla/pyjwt/security/advisories/…
M
Mathieu Rollet

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

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

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


A
Alireza

通过这种方法使用它:

str.encode().decode()

如果您需要解码 idna 或任何其他编码,bytearray(str, 'encoding').decode('another_encoding') 就可以完成这项工作
这是没用的。您正在编码为 UTF-8,然后将生成的字节解码为 UTF-8,最终从您开始的地方结束。您正在保持 CPU 温暖而没有其他好处。
@MartijnPieters“从你开始的地方结束” - 如果你的字符串中有转义序列,例如: >>> '\u0159'.encode().decode() 'ř'
@Peter:不,您不需要为此进行编码或解码。 '\u0159' 打印完全相同的输出。您将字符串文字语法与值的规范表示混淆了。
可以直接使用,不需要编码再解码。
F
Flimm

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

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

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

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

在您的情况下,您正在调用 data.decode("UTF-8") ,但该变量已经是 str 对象并且已经解码。因此,如果您需要字符串,请直接参考 data


R
Rex5

对于 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'))

这和这个问题有什么关系?你能解释一下你的答案在做什么吗?
B
Broper

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

>>> my_byte_str
b'Hello World'

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

它们没有以 bytes 对象开头,并且 str(bytes_object, codec) 只是 bytes_object.decode(codec) 的替代拼写。如果您确实有 str,则两者都会失败。
没错,这个特定问题确实已经有一个 str。这个答案对将来可能有字节数组的人仍然有用(这是我最初偶然发现这篇文章时遇到的问题)。
但是,我不确定您是如何偶然发现这篇文章的,因为 my_byte_str.decode 存在并且有效,并且不会在问题中抛出异常。
A
Aditya

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


N
Nikita Jain

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

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

D
Duc Toan Pham

这对我有用:

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

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


那条链救了我,随机尝试了这个解决方案!
这和这个问题有什么关系?你能解释一下这段代码在做什么吗?
t
tlentali

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

logmodel = LogisticRegression(solver='liblinear')

这与问题有什么关系?不知道是不是和邮箱有关系?
d
demongolem

其他答案有点暗示,但问题可能来自期望字节对象。在 Python 3 中,当您有一个类字节对象时,解码是有效的。在 decode 之前运行 encode 可能会“解决”问题,但它是一对无用的操作,向我们上游提出了问题。


A
Anurag Dabas

在使用 Flask_JWT_extended 包创建 JWT access_token 时,我得到 'str' 对象没有属性 'decode'

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

以供参考:

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


S
Sujith Jeewantha

首先安装合适的JWT

pip3 install PyJWT

然后在你的代码中

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

这对我有用,我认为这会对你有所帮助


S
Samsul Islam

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

pip install PyJWT==1.7.1

正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center
这与 stackoverflow.com/a/65484529/247696 的答案相同
s
some dude

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

pip3 freeze > requirements.txt