Bagaimana cara mengubah 'string biner' ke string normal di Python3?

257

Misalnya, saya memiliki string seperti ini (nilai balik subprocess.check_output):

>>> b'a string'
b'a string'

Apa pun yang saya lakukan untuk itu, selalu dicetak dengan mengganggu b'sebelum string:

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

Adakah yang punya ide tentang cara menggunakannya sebagai string normal atau mengubahnya menjadi string normal?

Hanfei Sun
sumber
Kemungkinan rangkap dari Konversi byte ke string?
Georgy
@HanfeiSun apa yang Anda sebut " string biner " adalah objek byte (lihat informasi tentang objek byte di perpustakaan standar )
loved.by.Jesus

Jawaban:

357

Dekode itu.

>>> b'a string'.decode('ascii')
'a string'

Untuk mendapatkan byte dari string, disandikan.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
sumber
27
@lyomi, saya menggunakan asciikarena string yang diberikan dibuat dengan huruf ascii. Anda tidak perlu menentukan penyandian jika penyandiannya adalah utf-8(default dalam Python 3.x menurut str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi Pada tahun 2016 (dan hampir berakhir) orang masih menggunakan ascii. Ada banyak banyak produk dan sistem 'warisan' (termasuk spesifikasi), tetapi ada juga banyak alasan mengapa Anda mungkin membuat 'string biner' di mana Anda tidak ingin unicode atau sesuatu untuk dicoba dan 'menggabungkan' banyak byte ke dalam satu karakter. Kami sering menggunakan 'string' untuk berisi data biner misalnya membuat permintaan DNS dll.
Jmons
Saya sarankan untuk menambahkan yang berikut untuk melengkapi jawaban. Sering kali kita perlu mendekode byte dari sistem operasi kita, seperti keluaran konsol, cara paling pythonic yang saya temukan untuk melakukannya adalah untuk import localekemudian os_encoding = locale.getpreferredencoding(). Dengan cara ini, kita dapat mendekode menggunakanmy_b_string.decode(os_encoding)
aturegano
2
@aturegano, Ini bukan satu-satunya pilihan. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, menggunakan deteksi pengodean otomatis dapat memecahkan masalah karena sub-program (OP menggunakan subproses) dapat ditulis dengan cara lain untuk menentukan pengodean (atau bahkan hard-coded). Terima kasih atas umpan baliknya.
falsetru
@ falsetru Catatan yang sys.getfilesystemencoding()mengembalikan nama pengkodean yang digunakan untuk mengkonversi antara nama file Unicode dan byte nama file dan sangat bergantung pada sistem operasi yang Anda gunakan. AFAIK, fungsi ini digunakan untuk mengkonversi ke representasi sistem yang lebih disukai. Itu berarti bahwa itu tidak akan menyimpulkan kodifikasi yang digunakan oleh konsol yang dapat diperoleh dengan menggunakan locale.getpreferredencoding()fungsi yang disebutkan di atas
aturegano
71

Jika jawaban dari falsetru tidak berfungsi, Anda juga dapat mencoba:

>>> b'a string'.decode('utf-8')
'a string'
kame
sumber
0

Silakan, lihat kantor encode()dan decode()dokumentasi dari codecsperpustakaan. utf-8adalah pengkodean default untuk fungsi, tetapi ada beberapa pengkodean standar dalam Python 3, seperti latin_1atau utf_32.

Daniel Argüelles
sumber