'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
供参考:
在 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')
这对我有用,我想这会对你有所帮助
这是我的代码:
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
供参考:
在 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')
这对我有用,我想这会对你有所帮助