개발/Python

'str'개체에는 'decode'속성이 없습니다. 파이썬 3 오류?

MinorMan 2021. 1. 8. 06:05
반응형

<질문>

내 코드는 다음과 같습니다.

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

첫 번째 이메일 만 선택합니다. 모두 선택하려면 어떻게합니까?


<답변1>

다음과 같은 개체를 디코딩하려고합니다.이미 디코딩. 당신은str, 더 이상 UTF-8에서 디코딩 할 필요가 없습니다.

간단히.decode('utf-8')부품:

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

당신의fetch()첫 번째 메시지 만 명시 적으로 요청하는 것입니다. 더 많은 메시지를 검색하려면 범위를 사용하십시오. 참조documentation:

아래 명령에 대한 message_set 옵션은 처리 할 하나 이상의 메시지를 지정하는 문자열입니다. 단순 메시지 번호 ( '1'), 메시지 번호 범위 ( '2 : 4') 또는 쉼표로 구분 된 연속되지 않은 범위 그룹 ( '1 : 3,6 : 9') 일 수 있습니다. 범위에는 무한 상한 ( '3 : *')을 나타내는 별표가 포함될 수 있습니다.


<답변2>

이 방법으로 사용 :

str.encode().decode()

<답변3>

Python 3부터 모든 문자열은 유니 코드 객체입니다.

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

이전 코드는 동일합니다. 그래서 나는 당신이 제거해야한다고 생각합니다.decode('utf-8'). 이미 유니 코드 객체를 얻었 기 때문입니다.


<답변4>

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

<답변5>

라이브러리에 익숙하지 않지만 문제가 바이트 배열을 원하지 않는 경우 한 가지 쉬운 방법은 캐스트에서 바로 인코딩 유형을 지정하는 것입니다.

>>> my_byte_str
b'Hello World'

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

<답변6>

PyJWT v2.0.0 릴리스 (2020 년 12 월 22 일) 이후 jwt 인증을 사용하여 여기에 도착하면 PyJWT 버전을 이전 릴리스로 고정 할 수 있습니다.requirements.txt파일.

PyJWT==1.7.1

<답변7>

이미 Python3에서 디코딩되었으며 직접 시도해보십시오.


<답변8>

코덱 모듈의 open ()을 사용하여 파일을 읽으십시오.

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

<답변9>

이것은 나를 위해 일했습니다.

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

이것은 json.loads (html) 동작과 유사합니다.


<답변10>

다른 대답은 일종의 힌트이지만 바이트 객체를 기대하면 문제가 발생할 수 있습니다. Python 3에서 디코딩은 클래스 바이트의 객체가있을 때 유효합니다. 디코딩 전에 인코딩을 실행하면 문제가 "수정"될 수 있지만 업스트림 문제를 암시하는 것은 쓸모없는 작업 쌍입니다.

반응형