ปราบปราม / พิมพ์โดยไม่มี b 'นำหน้าสำหรับไบต์ใน Python 3


112

เพียงโพสต์สิ่งนี้เพื่อที่ฉันจะได้ค้นหาในภายหลังเพราะดูเหมือนว่าจะทำให้ฉันสะดุดอยู่เสมอ:

$ 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'"

คำถาม: จะพิมพ์bytesสตริงbinary ( ) ใน Python 3 โดยไม่มีb'คำนำหน้าได้อย่างไร?


คำตอบ:


111

ใช้decode:

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

1
@jamylak เตือนว่าสามารถรับพารามิเตอร์ได้
Jemshit Iskenderov

1
จะทำอย่างไรโดยค่าเริ่มต้นฉันหมายถึงการใช้utf-8โดยค่าเริ่มต้นไม่ดีหรือไม่? ฉันไม่ต้องการใช้.decode('utf-8')ทุกครั้งที่พิมพ์อะไร
Shubham A.

สร้างงานพิมพ์แบบกำหนดเอง
SmartManoj

อย่าลืมตรวจสอบว่าcurses.versionไม่มี
cowlinator

24

หากไบต์ใช้การเข้ารหัสอักขระที่เหมาะสมอยู่แล้ว คุณสามารถพิมพ์ได้โดยตรง:

sys.stdout.buffer.write(data)

หรือ

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

12

หากเราดูที่แหล่งที่มาbytes.__repr__มันดูเหมือนว่าไฟล์b''ถูกอบเข้าไปในวิธีการ

วิธีแก้ปัญหาที่ชัดเจนที่สุดคือการตัดส่วนb''จากผลลัพธ์ด้วยตนเอง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
บันทึก Side: ฉันไม่คิดว่าคำตอบอื่น ๆอย่างแท้จริงตอบคำถาม
Mateen Ulhaq

ฉันคิดว่าฉันเห็นด้วย: วิธีแก้ปัญหาของคุณคือrepr(x)[2:-1]สร้างstrวัตถุที่จะพิมพ์ได้ตามต้องการ โดยเฉพาะอย่างยิ่งrepr(b'\x01')[2:-1]ผลตอบแทนสตริง\\x01ในขณะที่decode()จะกลับมาซึ่งไม่ได้ทำงานเป็นหนึ่งจะหวังกับ\x01 print()เพื่อให้ชัดเจนยิ่งขึ้นprint(repr(b'\x01')[2:-1])จะพิมพ์\x01ในขณะที่print(b'\x01'.decode())จะไม่พิมพ์อะไรเลย
Antoine

อีกวิธีหนึ่งคือprint(repr(b"\x01".decode()))จะพิมพ์'\x01'(สตริงที่มีเครื่องหมายคำพูดเดี่ยว) เพื่อให้print(repr(b"\x01".decode())[1:-1])พิมพ์\x01(สตริงที่ไม่มีเครื่องหมายคำพูดเดี่ยว)
Antoine

11

หากข้อมูลอยู่ในรูปแบบที่เข้ากันได้กับ UTF-8 คุณสามารถแปลงไบต์เป็นสตริงได้

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

เลือกที่จะแปลงเป็นฐานสิบหกก่อนหากข้อมูลยังไม่รองรับ UTF-8 เช่นเมื่อข้อมูลเป็นไบต์ดิบจริง

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.