Ini kode saya:
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('[email protected]', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')
pada titik ini saya mendapatkan pesan kesalahan
AttributeError: 'str' object has no attribute 'decode'
Python 3 tidak memiliki decode lagi, benarkan? bagaimana saya bisa memperbaikinya?
Juga di:
data = conn.fetch('1', '(BODY[HEADER])')
Saya hanya memilih email pertama. Bagaimana saya memilih semua?
sumber
decode
atribut, atau hanya menangkap pengecualian.try: data = data.decode('...') except AttributeError: pass
.Mulai dengan Python 3, semua string adalah objek unicode.
kode sebelumnya sama. Jadi saya pikir Anda harus menghapus
.decode('utf-8')
. Karena Anda sudah mendapatkan objek unicode.sumber
Gunakan dengan Metode ini:
sumber
bytearray(str, 'encoding').decode('another_encoding')
akan melakukan pekerjaan jika Anda perlu memecahkan kodeidna
atau pengkodean lainnya'\u0159'
mencetak hasil yang sama persis. Anda mengacaukan sintaks literal string dengan representasi kanonik nilai.Untuk Python3
sumber
Saya tidak terbiasa dengan pustaka, tetapi jika masalah Anda adalah Anda tidak ingin array byte, satu cara mudah adalah dengan menentukan jenis pengkodean langsung dalam gips:
sumber
bytes
objek untuk memulai, danstr(bytes_object, codec)
hanya ejaan alternatif untukbytes_object.decode(codec)
. Keduanya gagal jika Anda benar-benar memilikinyastr
.str
sudah ada. Jawaban ini masih bisa bermanfaat bagi orang-orang di masa depan yang mungkin memiliki array byte (ini adalah masalah yang saya hadapi ketika saya awalnya menemukan posting ini).my_byte_str.decode
ada dan berfungsi, dan tidak akan melempar pengecualian dalam pertanyaan.Sudah diterjemahkan dalam Python3, Coba langsung itu harus bekerja.
sumber
Jawaban lain semacam mengisyaratkan itu, tetapi masalah mungkin timbul dari mengharapkan objek byte. Dalam Python 3, decode valid ketika Anda memiliki objek byte kelas. Menjalankan penyandian sebelum decode dapat "memperbaiki" masalah, tetapi itu adalah sepasang operasi yang tidak berguna yang menyarankan masalah kita ke hulu.
sumber