& # 39; str # 39;对象没有属性'解码'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])')

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

769703 次浏览

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

简单地删除.decode('utf-8')部分:

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

至于你的fetch()调用,你显式地只要求第一条消息。如果要检索更多消息,请使用范围。参见文档:

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

从Python 3开始,所有字符串都是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中,decode在具有bytes类的对象时有效。在解码之前运行encode可能会“修复”问题,但这是一对无用的操作,向上游提示问题。

使用codecs模块的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版本(22/12/2020)之后使用jwt身份验证登陆这里,你可能想要在requirements.txt文件中将你的PyJWT版本冻结到上一个版本。

PyJWT==1.7.1

在使用Flask_JWT_extended包创建JWT access_token时,我得到了str的对象没有“解码”属性。

为了解决这个问题,我将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时遇到同样的错误,下面是解决方案:

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

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