<질문>
내 코드는 다음과 같습니다.
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에서 디코딩은 클래스 바이트의 객체가있을 때 유효합니다. 디코딩 전에 인코딩을 실행하면 문제가 "수정"될 수 있지만 업스트림 문제를 암시하는 것은 쓸모없는 작업 쌍입니다.
'개발 > Python' 카테고리의 다른 글
PyQt : 개별 헤더에 대해 다른 헤더 크기를 어떻게 설정합니까? (0) | 2021.01.09 |
---|---|
파이썬에서 구분 기호로 문자열 분할 (0) | 2021.01.08 |
Python csv에서 list 가져 오기 (0) | 2021.01.08 |
클래스 개체에 대한 사용자 지정 문자열 표현을 만드는 방법은 무엇입니까? (0) | 2021.01.08 |