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').
strfungsi tidak dikonversi menjadi string nyata lagi. Seseorang HARUS mengatakan penyandian secara eksplisit untuk beberapa alasan saya malas membaca alasannya. Konversikan ke utf-8dan 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_objdaripada 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.