Di python 2.x saya bisa melakukan ini:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Namun sekarang, saya mendapatkan file TypeError: can't write bytes to text stream
. Apakah ada pengkodean rahasia yang harus saya gunakan?
python
python-3.x
Ivan Baldin
sumber
sumber
os.write
akan bekerja pada Py2 dan Py3.Jawaban:
Cara yang lebih baik:
sumber
sys.stdout.buffer
juga memungkinkan Anda melakukan hal-hal seperti menggunakanshutil.copyfileobj
bahkan ketika objek file sumber memberikan byte, dan bukan string. +1AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
menjalankan IDLE, yang berarti tidak ada stdout. Ini ditiru dengan tkinter. Secara fisik tidak dapat menangani byte. Dalam hal ini,.decode('UTF-8', errors='replace')
string Anda, atau jalankanpython3 -I <filename>
untuk mendapatkan REPL daripada menggunakan IDLE.stderr
jika menggunakan bersamaprint(file=sys.stderr)
.atau,
os.write(sys.stdout.fileno(), …)
jika itu lebih mudah dibaca daripada1
Anda.sumber
os.write
adalah Anda harus memeriksa nilai pengembalian, karena tidak menjamin bahwa semuanya akan ditulis.Cara idiomatis untuk melakukannya, yang hanya tersedia untuk Python 3, adalah:
Bagian yang baik adalah ia menggunakan antarmuka objek file normal, yang semua orang terbiasa dengan Python.
Perhatikan bahwa saya mengatur
closefd=False
untuk menghindari penutupansys.stdout
saat keluar dariwith
blok. Jika tidak, program Anda tidak akan dapat mencetak ke stdout lagi. Namun, untuk jenis deskriptor file lainnya, Anda mungkin ingin melewatkan bagian itu.sumber
Jika Anda ingin menentukan pengkodean dalam python3, Anda masih dapat menggunakan perintah byte seperti di bawah ini:
di mana 1 adalah nomor biasa yang sesuai untuk stdout -> sys.stdout.fileno ()
Sebaliknya, jika Anda tidak peduli dengan pengkodean, gunakan saja:
Jika Anda ingin menggunakan os.write tanpa pengkodean, coba gunakan yang di bawah ini:
sumber
os.write(sys.stdout.fileno(), some_bytes)
tidak akan bekerja di IDLE.io.UnsupportedOperation: fileno
stdout
, yang terakhir.