Tôi đang sử dụng mã này để nhận đầu ra tiêu chuẩn từ một chương trình bên ngoài:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Phương thức truyền thông () trả về một mảng 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'
Tuy nhiên, tôi muốn làm việc với đầu ra như một chuỗi Python bình thường. Để tôi có thể in nó như thế này:
>>> 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
Tôi nghĩ đó là phương thức binascii.b2a_qp () để làm gì, nhưng khi tôi thử nó, tôi lại nhận được mảng byte tương tự:
>>> 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'
Làm cách nào để chuyển đổi giá trị byte trở lại chuỗi? Ý tôi là, sử dụng "pin" thay vì làm thủ công. Và tôi muốn nó ổn với Python 3.
str(text_bytes)
không thể chỉ định mã hóa. Tùy thuộc vào những gì trong text_bytes, text_bytes.decode('cp1250
) `có thể dẫn đến một chuỗi rất khác nhau text_bytes.decode('utf-8')
.
str
hàm không chuyển đổi thành một chuỗi thực nữa. Một người đã nói một cách mã hóa rõ ràng vì một số lý do tôi lười đọc qua tại sao. Chỉ cần chuyển đổi nó utf-8
và xem nếu mã ur hoạt động. ví dụvar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
hoạt động như mong đợi trên Python 3. Mặc dù vậy, unicode_text = bytestring.decode(character_encoding)
tốt hơn là tránh nhầm lẫn với việc chỉ str(bytes_obj)
tạo ra một biểu diễn văn bản bytes_obj
thay vì giải mã nó thành văn bản: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
vàstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
làm việc Điều này có vẻ kỳ quái với tôi.