Python 2.x'te şunu yapabilirim:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Ancak şimdi bir TypeError: can't write bytes to text stream
. Kullanmam gereken gizli kodlama var mı?
Python 2.x'te şunu yapabilirim:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Ancak şimdi bir TypeError: can't write bytes to text stream
. Kullanmam gereken gizli kodlama var mı?
os.write
hem Py2 hem de Py3 üzerinde çalışacaktır.
Yanıtlar:
En iyi yol:
import sys
sys.stdout.buffer.write(b"some binary data")
sys.stdout.buffer
da kullandığınız gibi şeyler yapalım shutil.copyfileobj
dizeleri kaynak dosya nesne bayt verdiğinde bile değil. +1
AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
çalıştırır, bu da standart çıkış olmadığı anlamına gelir. Tkinter ile emüle edilmiştir. Baytları fiziksel olarak işleyemez. Bu durumda, IDLE kullanmak yerine bir REPL almak için dizeniz .decode('UTF-8', errors='replace')
veya çalıştırın python3 -I <filename>
.
stderr
birlikte kullanılırsa , yazarken yazma sırasını bozar print(file=sys.stderr)
.
import os
os.write(1, a.tostring())
veya os.write(sys.stdout.fileno(), …)
bu 1
sizden daha okunaklıysa .
os.write
, her şeyin yazılacağını garanti etmediği için dönüş değerini kontrol etmeniz gerekmesidir.
Bunu yapmanın sadece Python 3 için geçerli olan deyimsel bir yolu şudur:
with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
stdout.write(b"my bytes object")
stdout.flush()
İşin iyi yanı, Python'da herkesin alışkın olduğu normal dosya nesnesi arayüzünü kullanmasıdır.
Bloktan çıkarken closefd=False
kapatmayı önlemeye ayarladığıma dikkat edin . Aksi takdirde, programınız artık stdout'a yazdıramaz. Bununla birlikte, diğer türden dosya tanımlayıcıları için bu bölümü atlamak isteyebilirsiniz.sys.stdout
with
Python3'te bir kodlama belirtmek isterseniz, yine de aşağıdaki gibi bayt komutunu kullanabilirsiniz:
import os
os.write(1,bytes('Your string to Stdout','UTF-8'))
burada 1, stdout -> sys.stdout.fileno () için karşılık gelen olağan sayıdır
Aksi takdirde, kodlamayı önemsemiyorsanız sadece şunu kullanın:
import sys
sys.stdout.write("Your string to Stdout\n")
Os.write'ı kodlama olmadan kullanmak istiyorsanız, aşağıdakileri kullanmayı deneyin:
import os
os.write(1,b"Your string to Stdout\n")
os.write(sys.stdout.fileno(), some_bytes)
IDLE'de çalışmaz. io.UnsupportedOperation: fileno
stdout
, sonuncusu.