Saya menggunakan kode ini untuk mendapatkan output standar dari program eksternal:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Metode berkomunikasi () mengembalikan array byte:
>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Namun, saya ingin bekerja dengan output sebagai string Python normal. Sehingga saya bisa mencetaknya seperti ini:
>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2
Saya pikir itulah gunanya metode binascii.b2a_qp () , tetapi ketika saya mencobanya, saya mendapatkan array byte yang sama lagi:
>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Bagaimana cara mengubah nilai byte kembali ke string? Maksud saya, menggunakan "baterai" alih-alih melakukannya secara manual. Dan saya ingin itu baik-baik saja dengan Python 3.
str(text_bytes)
tidak dapat menentukan pengkodean. Bergantung pada apa yang ada di text_bytes, text_bytes.decode('cp1250
) `mungkin menghasilkan string yang sangat berbeda text_bytes.decode('utf-8')
.
str
fungsi tidak dikonversi menjadi string nyata lagi. Seseorang HARUS mengatakan penyandian secara eksplisit untuk beberapa alasan saya malas membaca alasannya. Konversikan ke utf-8
dan lihat apakah kode ur Anda berfungsi. mis.var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
berfungsi seperti yang diharapkan pada Python 3. Meskipun unicode_text = bytestring.decode(character_encoding)
lebih disukai untuk menghindari kebingungan dengan hanya str(bytes_obj)
yang menghasilkan representasi teks untuk bytes_obj
daripada mendekodekan ke teks: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
danstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
bekerja Ini sepertinya aneh bagi saya.