ใน python 2.x ฉันทำได้:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
อย่างไรก็ตามตอนนี้ฉันได้รับไฟล์TypeError: can't write bytes to text stream. มีการเข้ารหัสลับบางอย่างที่ฉันควรใช้หรือไม่?
ใน python 2.x ฉันทำได้:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
อย่างไรก็ตามตอนนี้ฉันได้รับไฟล์TypeError: can't write bytes to text stream. มีการเข้ารหัสลับบางอย่างที่ฉันควรใช้หรือไม่?
os.writeจะทำงานได้ทั้งบน Py2 และ Py3
คำตอบ:
วิธีที่ดีกว่า:
import sys
sys.stdout.buffer.write(b"some binary data")
sys.stdout.bufferยังช่วยให้คุณทำสิ่งต่างๆเช่นการใช้shutil.copyfileobjแม้ว่าออบเจ็กต์ไฟล์ต้นทางจะให้ไบต์และไม่ใช่สตริง +1
AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exeรัน IDLE ซึ่งหมายความว่าไม่มี stdout มันถูกเลียนแบบด้วย tkinter มันไม่สามารถจัดการกับไบต์ได้ ในกรณีนี้.decode('UTF-8', errors='replace')สตริงของคุณหรือเรียกใช้python3 -I <filename>เพื่อรับ REPL แทนที่จะใช้ IDLE
stderr print(file=sys.stderr)
import os
os.write(1, a.tostring())
หรือos.write(sys.stdout.fileno(), …)หากอ่านได้ง่ายกว่า1สำหรับคุณ
os.writeคือคุณจะต้องตรวจสอบมูลค่าที่ส่งคืนเนื่องจากไม่รับประกันว่าทุกอย่างจะเป็นลายลักษณ์อักษร
วิธีที่เป็นสำนวนซึ่งมีเฉพาะใน Python 3 คือ:
with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
stdout.write(b"my bytes object")
stdout.flush()
ส่วนที่ดีคือมันใช้อินเตอร์เฟสไฟล์อ็อบเจ็กต์ปกติซึ่งทุกคนคุ้นเคยใน Python
สังเกตว่าฉันกำลังตั้งค่าที่closefd=Falseจะหลีกเลี่ยงการปิดsys.stdoutเมื่อออกจากwithบล็อก มิฉะนั้นโปรแกรมของคุณจะไม่สามารถพิมพ์ไปยัง stdout ได้อีกต่อไป อย่างไรก็ตามสำหรับตัวอธิบายไฟล์ประเภทอื่นคุณอาจต้องข้ามส่วนนั้นไป
ในกรณีที่คุณต้องการระบุการเข้ารหัสใน python3 คุณยังสามารถใช้คำสั่ง bytes ดังต่อไปนี้:
import os
os.write(1,bytes('Your string to Stdout','UTF-8'))
โดยที่ 1 คือหมายเลขปกติที่สอดคล้องกันสำหรับ stdout -> sys.stdout.fileno ()
มิฉะนั้นหากคุณไม่สนใจการเข้ารหัสให้ใช้:
import sys
sys.stdout.write("Your string to Stdout\n")
หากคุณต้องการใช้ os.write โดยไม่ต้องเข้ารหัสให้ลองใช้สิ่งต่อไปนี้:
import os
os.write(1,b"Your string to Stdout\n")
os.write(sys.stdout.fileno(), some_bytes)จะไม่ทำงานใน IDLE io.UnsupportedOperation: fileno
stdoutวิธีสุดท้าย