Làm cách nào để chuyển đổi 'chuỗi nhị phân' thành chuỗi bình thường trong Python3?


257

Ví dụ: tôi có một chuỗi như thế này (giá trị trả về của subprocess.check_output):

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

Bất cứ điều gì tôi đã làm với nó, nó luôn được in với sự khó chịu b'trước chuỗi:

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

Có ai có bất kỳ ý tưởng nào về cách sử dụng nó như một chuỗi bình thường hoặc chuyển đổi nó thành một chuỗi bình thường không?



@HanfeiSun cái mà bạn gọi là " chuỗi nhị phân " là một đối tượng byte (xem thông tin về đối tượng byte trong thư viện chuẩn )
Lov.by.Jesus

Câu trả lời:


357

Giải mã nó.

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

Để lấy byte từ chuỗi, mã hóa nó.

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

27
@lyomi, tôi đã sử dụng asciivì chuỗi đã cho được tạo bằng các chữ cái ascii. Bạn không cần phải xác định mã hóa nếu mã hóa là utf-8(mặc định bằng Python 3.x theo str.encode, bytes.decodedoc-string)
falsetru

2
@lyomi Năm 2016 (và gần hết) mọi người vẫn sử dụng ascii. Có nhiều sản phẩm và hệ thống 'di sản' (bao gồm cả thông số kỹ thuật), nhưng cũng có nhiều lý do khiến bạn có thể tạo ra một 'chuỗi nhị phân' nơi bạn không muốn unicode hoặc một cái gì đó để thử và 'hợp nhất' nhiều byte vào một nhân vật duy nhất. Chúng tôi thường sử dụng 'chuỗi' để chứa dữ liệu nhị phân, ví dụ như thực hiện các yêu cầu DNS, v.v.
Jmons

Tôi đề nghị thêm vào sau đây để hoàn thành câu trả lời. Hầu hết thời gian chúng ta cần giải mã byte từ hệ điều hành của mình, chẳng hạn như đầu ra của bàn điều khiển, cách thức pythonic nhất mà tôi tìm thấy để làm điều đó là import localevà sau đó os_encoding = locale.getpreferredencoding(). Bằng cách này, chúng ta có thể giải mã bằng cách sử dụngmy_b_string.decode(os_encoding)
aturegano

2
@aturegano, Đây không phải là lựa chọn duy nhất. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, sử dụng các phát hiện mã hóa tự động đó có thể giải quyết vấn đề vì chương trình con (OP đang sử dụng quy trình con) có thể được viết theo cách khác để xác định mã hóa (hoặc thậm chí mã hóa cứng). Dù sao cũng cảm ơn bạn đã phản hồi.
falsetru

@falsetru Lưu ý rằng sys.getfilesystemencoding()trả về tên của mã hóa được sử dụng để chuyển đổi giữa tên tệp Unicode và tên tệp byte và phụ thuộc rất nhiều vào hệ điều hành bạn đang sử dụng. AFAIK, chức năng này được sử dụng để chuyển đổi thành đại diện ưa thích của hệ thống. Điều đó có nghĩa là nó sẽ không suy ra sự mã hóa được sử dụng bởi bàn điều khiển có thể thu được bằng cách sử dụng locale.getpreferredencoding()chức năng đã nói ở trên
aturegano

71

Nếu câu trả lời từ falsetru không hoạt động, bạn cũng có thể thử:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.