วิธีการแปลง 'ไบนารีสตริง' เป็นสตริงปกติใน Python3


258

ตัวอย่างเช่นฉันมีสตริงเช่นนี้ (คืนค่าsubprocess.check_output):

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

ไม่ว่าฉันจะทำอะไรมันจะพิมพ์ด้วยความน่ารำคาญอยู่b'ตรงหน้าสตริงเสมอ:

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

ไม่มีใครมีแนวคิดใด ๆ เกี่ยวกับวิธีใช้เป็นสตริงปกติหรือแปลงเป็นสตริงปกติหรือไม่


เป็นไปได้ที่ซ้ำกันของการแปลงไบต์เป็นสตริงหรือไม่?
Georgy

@HanfeiSun สิ่งที่คุณเรียกว่า " สตริงไบนารี " เป็นวัตถุไบต์ (ดูข้อมูลเกี่ยวกับวัตถุไบต์ในห้องสมุดมาตรฐาน )
loved.by.Jesus

คำตอบ:


357

ถอดรหัสมัน

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

หากต้องการรับไบต์จากสตริงให้เข้ารหัส

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

27
@lyomi ฉันใช้asciiเพราะสตริงที่กำหนดทำด้วยตัวอักษร ascii คุณไม่จำเป็นต้องระบุการเข้ารหัสหากการเข้ารหัสนั้นเป็นutf-8ค่าเริ่มต้นใน Python 3.x ตามstr.encodeด้วยbytes.decodedoc-string)
falsetru

2
@lyomi ในปี 2559 (และใกล้จะสิ้นสุด) ผู้คนยังคงใช้ ascii มีผลิตภัณฑ์และระบบ 'ดั้งเดิม' มากมาย (รวมถึงข้อมูลจำเพาะ) แต่ยังมีเหตุผลมากมายที่คุณอาจสร้าง 'ไบนารีสตริง' ซึ่งคุณไม่ต้องการให้ยูนิโค้ดหรือสิ่งที่ต้องลองและ 'ผสาน' หลายไบต์เข้า ตัวละครเดียว เรามักจะใช้ 'สาย' ที่จะมีข้อมูลไบนารีสำหรับการร้องขอการทำเช่น DNS ฯลฯ
Jmons

ฉันขอแนะนำให้เพิ่มสิ่งต่อไปนี้เพื่อทำคำตอบให้สมบูรณ์ เวลาส่วนใหญ่เราต้องถอดรหัสไบต์จากระบบปฏิบัติการของเราเช่นการส่งออกคอนโซลวิธี pythonic ที่สุดที่ฉันพบที่จะทำก็คือการแล้วimport locale os_encoding = locale.getpreferredencoding()วิธีนี้เราสามารถถอดรหัสโดยใช้my_b_string.decode(os_encoding)
aturegano

2
@aturegano มันไม่ใช่ตัวเลือกเดียว sys.getfilesystemencoding(), ,sys.stdin.encoding sys.stdout.encodingIMHO การใช้การตรวจจับการเข้ารหัสอัตโนมัตินั้นสามารถแก้ไขปัญหาได้เนื่องจากโปรแกรมย่อย (OP กำลังใช้งานระบบย่อย) สามารถเขียนวิธีอื่นเพื่อพิจารณาการเข้ารหัส (หรือแม้แต่รหัสฮาร์ด) ขอบคุณสำหรับคำติชม
falsetru

@falsetru โปรดทราบว่าsys.getfilesystemencoding()จะส่งคืนชื่อของการเข้ารหัสที่ใช้ในการแปลงระหว่างชื่อไฟล์ Unicode และชื่อไฟล์ไบต์และขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้เป็นอย่างมาก AFAIK ฟังก์ชั่นนี้จะใช้ในการแปลงเป็นตัวแทนที่ต้องการของระบบ นั่นหมายความว่ามันจะไม่อนุมานว่า codification ที่ใช้โดยคอนโซลที่สามารถรับได้โดยใช้locale.getpreferredencoding()ฟังก์ชั่นดังกล่าว
aturegano


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