ฉันใช้รหัสนี้เพื่อรับเอาต์พุตมาตรฐานจากโปรแกรมภายนอก:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
วิธีการสื่อสาร () วิธีการส่งกลับอาร์เรย์ไบต์:
>>> 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'
อย่างไรก็ตามฉันต้องการทำงานกับผลลัพธ์เป็นสตริง Python ปกติ เพื่อให้ฉันสามารถพิมพ์ได้เช่นนี้
>>> 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
ฉันคิดว่านั่นเป็นวิธีการbinascii.b2a_qp ()สำหรับ แต่เมื่อฉันลองแล้วฉันจะได้อาร์เรย์ไบต์เดียวกันอีกครั้ง:
>>> 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'
ฉันจะแปลงค่าไบต์กลับเป็นสตริงได้อย่างไร ฉันหมายถึงการใช้ "แบตเตอรี่" แทนที่จะทำด้วยตนเอง และฉันต้องการให้มันใช้ได้กับ Python 3
str(text_bytes)
ไม่สามารถระบุการเข้ารหัสได้ ทั้งนี้ขึ้นอยู่กับสิ่งที่อยู่ใน text_bytes, text_bytes.decode('cp1250
) text_bytes.decode('utf-8')
`อาจส่งผลสตริงที่แตกต่างกันมากที่จะ
str
ฟังก์ชั่นจะไม่แปลงเป็นสตริงจริงอีกต่อไป มีหนึ่งที่จะพูดการเข้ารหัสอย่างชัดเจนด้วยเหตุผลบางอย่างฉันขี้เกียจอ่านทำไม เพียงแปลงเป็นutf-8
และดูว่ารหัส ur ใช้งานได้หรือไม่ เช่นvar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
ทำงานได้ตามที่คาดไว้ใน Python 3 แม้ว่าunicode_text = bytestring.decode(character_encoding)
จะดีกว่าเพื่อหลีกเลี่ยงความสับสนกับการstr(bytes_obj)
สร้างข้อความแทนbytes_obj
แทนที่จะถอดรหัสเป็นข้อความ: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
และstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
ทำงาน นี่มันแปลกประหลาดสำหรับฉัน