Bagaimana cara mengubah variabel string byte 3 Python menjadi string biasa?

116

Saya telah membaca di lampiran email XML dengan

bytes_string=part.get_payload(decode=False)

Payload masuk sebagai string byte, seperti yang disarankan oleh nama variabel saya.

Saya mencoba menggunakan pendekatan Python 3 yang direkomendasikan untuk mengubah string ini menjadi string yang dapat digunakan yang dapat saya manipulasi.

Contohnya menunjukkan:

str(b'abc','utf-8')

Bagaimana saya bisa menerapkan bargumen kata kunci (byte) ke variabel saya bytes_stringdan menggunakan pendekatan yang disarankan?

Cara saya mencoba tidak berhasil:

str(bbytes_string, 'utf-8')
DjangoTango
sumber

Jawaban:

210

Anda hampir benar di baris terakhir. Kamu ingin

str(bytes_string, 'utf-8')

karena type of bytes_stringis bytes, sama dengan type of b'abc'.

Toby Speight
sumber
6
str(bytes_string, 'utf-8', 'ignore')Kesalahan dapat diabaikan dengan meneruskan parameter ketiga.
Shubhamoy
2
Sepertinya itu harus menjadi komentar untuk jawaban pylang (yang menangani penanganan input yang tidak valid). Jika (Anda yakin bahwa) tidak ada yang salah bytes_string, mengapa Anda ingin mengabaikan kesalahan?
Toby Speight
3
Saya mendapatkan kesalahan berikut dengan pendekatan Anda: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteuntuk string byte berikut b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper
Ya @alper, itu bukan string UTF-8 yang valid, jadi apa yang Anda harapkan?
Toby Speight
Terima kasih atas solusinya
Ajay Kumar
49

Panggil decode()sebuah bytesinstance untuk mendapatkan teks yang dikodekannya.

str = bytes.decode()
uname01
sumber
5
UnicodeDecodeError: 'utf-8' codec tidak dapat mendekode byte 0xf6 di posisi 230: byte awal tidak valid
Juha Untinen
3
@JuhaMengenkode Anda mungkin bukan utf-8.
tommy.carstensen
4
Bagaimana cara memfilter (melewati) karakter non-UTF8 dari array?
Dr. Failov
9

DIPERBARUI:

UNTUK TIDAK MEMILIKI APA PUN bdan mengutip di awal dan akhir

Cara mengonversi bytesseperti yang terlihat menjadi string, bahkan dalam situasi aneh.

Karena kode Anda mungkin memiliki karakter yang tidak dapat dikenali untuk 'utf-8'dienkode, lebih baik menggunakan hanya str tanpa parameter tambahan:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

jika Anda menambahkan 'utf-8'parameter, ke byte spesifik ini, Anda akan menerima kesalahan.

Seperti yang dikatakan standar PYTHON 3, textakan berada di utf-8 sekarang tanpa masalah.

Seyfi
sumber
hasilnya adalah "b '\\ x02 - \\ xdfI #)'" yang mungkin bukan yang dia inginkan
Glen Thompson
@GlenThompson itu hanya contoh untuk kondisi yang tidak diinginkan, yang mungkin terjadi. Saya menggunakan teks khusus ini dengan sengaja. Jika yang Anda maksud teks memiliki bin yang pertama, maka saya memperbarui jawaban
Seyfi
jadi sangat terima kasih saya mencari cara untuk menghapus b '' dari string yang memiliki karakter ansi tanpa penyandian dan kehilangan karakter, saya baru dalam python dan tidak tahu daripada saya dapat mengurangi array dari awal dan mulai menggunakan indeks: O
Diego Fernando Murillo Valenci
@DiegoFernandoMurilloValenci, selamat datang. Senang bisa membantu.
Seyfi
6

Bagaimana cara memfilter (melewati) karakter non-UTF8 dari array?

Untuk mengatasi komentar ini di posting @ uname01 dan OP, abaikan kesalahan:

Kode

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

Detail

Dari dokumen , berikut lebih banyak contoh yang menggunakan errorsparameter yang sama :

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

Argumen error menentukan respons ketika string input tidak dapat dikonversi sesuai dengan aturan encoding. Nilai hukum untuk argumen ini adalah 'strict'(angkat UnicodeDecodeErrorpengecualian), 'replace'(gunakan U+FFFD, REPLACEMENT CHARACTER), atau 'ignore'(biarkan karakter di luar hasil Unicode).

pylang
sumber