' STR'对象没有属性' decode'。 Python 3错误?

时间:2015-02-18 12:20:06

标签: python python-3.x imaplib

这是我的代码:

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

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

12 个答案:

答案 0 :(得分:121)

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

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

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

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

  

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

答案 1 :(得分:38)

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

var toastEl = toast();
document.body.appendChild(toastEl)
const myToast = new Toast(toastEl);
myToast.show();

答案 2 :(得分:26)

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

  a = 'Happy New Year' # Python 3
  b = unicode('Happy New Year') # Python 2
之前的代码是一样的。所以我认为你应该删除.decode('utf-8')。因为你已经获得了unicode对象。

答案 3 :(得分:19)

通过此方法使用它:

str.encode().decode()

答案 4 :(得分:6)

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

>>> my_byte_str
b'Hello World'

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

答案 5 :(得分:2)

它已经在Python3中解码了,直接尝试就可以了。

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

这对我有用:

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

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

答案 8 :(得分:1)

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

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

供参考:

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

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:0)

对于Python3

html =“”“ \ u003Cdiv id = \ u0022contenedor \ u0022 \ u003E \ u003Ch2 class = \ u0022text-left mb-2 \ u0022 \ u003EInformaci \ u00f3n del veh \ u00edculo de Patente AA345AA \ u003C \ / h2 \ u003E \ n \ n \ n \ n \ u003Cdiv class = \ u0022panel panel-default-disabled mb-2 \ u0022 \ u003E \ n \ u003Cdiv class = \ u0022panel-body \ u0022 \ u003E \ n \ u003Ch2 class = \ u0022table_title mb- 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 \ u003EDpartamento \ u003C \ / label \ u003E \ n \ u003Cp \ u003E- \ u003C \ / p \ u003E \ n \ u003Clabel class = \ u0022control-la bel \ 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 = \ u0022文本中心mt-3 mb-1隐藏- 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'))

答案 11 :(得分:0)

其他答案对此有所提示,但是问题可能是由于期望字节对象引起的。在Python 3中,当您有一个类字节对象时,解码有效。在解码之前运行编码可能会“解决”问题,但这是无用的一对操作,将问题提示给上游。