Bỏ / in không có tiền tố b 'cho byte trong Python 3


112

Chỉ đăng cái này để tôi có thể tìm kiếm nó sau, vì nó dường như luôn làm tôi khó chịu:

$ python3.2
Python 3.2 (r32:88445, Oct 20 2012, 14:09:50) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
>>> print(curses.version)
b'2.2'
>>> print(str(curses.version))
b'2.2'
>>> print(curses.version.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
>>> print(str(curses.version).encode('utf-8'))
b"b'2.2'"

Câu hỏi: làm thế nào để in một chuỗi nhị phân ( bytes) trong Python 3, không có b'tiền tố?


Câu trả lời:


111

Sử dụng decode:

print(curses.version.decode())
# 2.2

1
@jamylak nó là lời nhắc nhở rằng nó có thể chấp nhận tham số
Jemshit Iskenderov

1
Làm thế nào để làm điều này theo mặc định, ý tôi là, sử dụng utf-8theo mặc định có tệ không? Tôi không muốn sử dụng .decode('utf-8')mỗi khi tôi in một cái gì đó.
Shubham A.

Tạo bản in tùy chỉnh
SmartManoj

Hãy chắc chắn kiểm tra rằng curses.versionkhông phải là Không có
cowlinator

24

Nếu các byte đã sử dụng mã hóa ký tự thích hợp; bạn có thể in chúng trực tiếp:

sys.stdout.buffer.write(data)

hoặc là

nwritten = os.write(sys.stdout.fileno(), data)  # NOTE: it may write less than len(data) bytes

12

Nếu chúng ta xem xét nguồn cho bytes.__repr__, có vẻ như nó b''được đưa vào phương thức.

Cách giải quyết rõ ràng nhất là tách thủ công b''khỏi kết quả repr():

>>> x = b'\x01\x02\x03\x04'

>>> print(repr(x))
b'\x01\x02\x03\x04'

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04

6
Lưu ý phụ: Tôi không nghĩ rằng bất kỳ câu trả lời nào khác thực sự trả lời câu hỏi.
Mateen Ulhaq,

Tôi nghĩ rằng tôi sẽ đồng ý: giải pháp của bạn, cụ thể là repr(x)[2:-1], tạo ra một strđối tượng sẽ in như mong muốn. Đặc biệt, repr(b'\x01')[2:-1]trả về chuỗi \\x01, trong khi decode()sẽ trả về \x01không hoạt động như người ta mong muốn print(). Nói rõ hơn nữa, print(repr(b'\x01')[2:-1])sẽ in \x01trong khi print(b'\x01'.decode())sẽ không in bất cứ thứ gì.
Antoine

Ngoài ra, print(repr(b"\x01".decode()))sẽ in '\x01'(một chuỗi bao gồm các dấu nháy đơn), để print(repr(b"\x01".decode())[1:-1])in \x01(một chuỗi không có dấu nháy đơn).
Antoine

11

Nếu dữ liệu ở định dạng tương thích UTF-8, bạn có thể chuyển đổi các byte thành một chuỗi.

>>> import curses
>>> print(str(curses.version, "utf-8"))
2.2

Tùy chọn chuyển đổi sang hex trước, nếu dữ liệu chưa tương thích UTF-8. Ví dụ: khi dữ liệu là byte thô thực tế.

from binascii import hexlify
from codecs import encode  # alternative
>>> print(hexlify(b"\x13\x37"))
b'1337'
>>> print(str(hexlify(b"\x13\x37"), "utf-8"))
1337
>>>> print(str(encode(b"\x13\x37", "hex"), "utf-8"))
1337
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.