这是我的代码:
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])')
我只选择第一封电子邮件。如何全选?
您正在尝试解码已解码的对象。您有一个 str
,不再需要从 UTF-8 解码。
只需删除 .decode('utf-8')
部分:
header_data = data[1][0][1]
至于您的 fetch()
电话,您只是明确要求第一条消息。如果要检索更多消息,请使用范围。请参阅 documentation:
下面命令的 message_set 选项是一个字符串,指定要处理的一条或多条消息。它可能是一个简单的消息编号 ('1')、一个消息编号范围 ('2:4') 或一组用逗号分隔的不连续范围 ('1:3,6:9')。一个范围可以包含一个星号来表示一个无限的上限('3:*')。
如果您在 PyJWT v2.0.0 版本 (22/12/2020) 之后使用 jwt 身份验证登陆此处,您可能希望在 requirements.txt
文件中将您的 PyJWT 版本冻结为之前的版本。
PyJWT==1.7.1
rest_framework_simplejwt
包中的依赖项,并导致了问题。
从 Python 3 开始,所有字符串都是 unicode 对象。
a = 'Happy New Year' # Python 3
b = unicode('Happy New Year') # Python 2
上面的说明是一样的。所以我认为你应该删除 .decode('utf-8')
部分,因为你已经有一个 unicode 对象。
通过这种方法使用它:
str.encode().decode()
idna
或任何其他编码,bytearray(str, 'encoding').decode('another_encoding')
就可以完成这项工作
'\u0159'
打印完全相同的输出。您将字符串文字语法与值的规范表示混淆了。
在 Python 3 中,这种心智模型非常简单:
编码是将 str 转换为 bytes 对象的过程
解码是将 bytes 对象转换为 str 的过程
┏━━━━━━━┓ ┏━━━━━━━┓
┃ ┃ -> encoding -> ┃ ┃
┃ str ┃ ┃ bytes ┃
┃ ┃ <- decoding <- ┃ ┃
┗━━━━━━━┛ ┗━━━━━━━┛
在您的情况下,您正在调用 data.decode("UTF-8")
,但该变量已经是 str
对象并且已经解码。因此,如果您需要字符串,请直接参考 data
。
对于 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'))
我不熟悉该库,但如果您的问题是您不想要字节数组,一种简单的方法是直接在强制转换中指定编码类型:
>>> 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
存在并且有效,并且不会在问题中抛出异常。
它已经在 Python3 中解码,直接尝试它应该可以工作。
使用编解码器模块的 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) 行为
如果有人在参加 Kaggle 的 Logistic REgre 时遇到同样的错误,这里是解决方案:
logmodel = LogisticRegression(solver='liblinear')
其他答案有点暗示,但问题可能来自期望字节对象。在 Python 3 中,当您有一个类字节对象时,解码是有效的。在 decode 之前运行 encode 可能会“解决”问题,但它是一对无用的操作,向我们上游提出了问题。
在使用 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/
首先安装合适的JWT
pip3 install PyJWT
然后在你的代码中
token.encode().decode('UTF-8')
这对我有用,我认为这会对你有所帮助
如果您使用 Django 和 simple-jwt:这是您的 100% 解决方案
pip install PyJWT==1.7.1
我的情况可能有点少见,但我正在使用 django 并且我的项目在本地运行,但当我部署它时没有运行,似乎我遇到了多个依赖错误,因为我正在这样做:pip freeze > requirements.txt
这样做解决了问题:
pip3 freeze > requirements.txt
不定期副业成功案例分享
decode
属性,或只是捕获异常。try: data = data.decode('...') except AttributeError: pass
。