W pythonie 2.x mogłem to zrobić:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Teraz jednak otrzymuję plik TypeError: can't write bytes to text stream. Czy jest jakieś tajne kodowanie, którego powinienem użyć?
W pythonie 2.x mogłem to zrobić:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Teraz jednak otrzymuję plik TypeError: can't write bytes to text stream. Czy jest jakieś tajne kodowanie, którego powinienem użyć?
os.writebędzie działać zarówno na Py2, jak i Py3.
Odpowiedzi:
Lepszy sposób:
import sys
sys.stdout.buffer.write(b"some binary data")
sys.stdout.bufferpozwala również robić takie rzeczy, jak używanie, shutil.copyfileobjnawet jeśli obiekt pliku źródłowego podaje bajty, a nie łańcuchy. +1
AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exeuruchamia IDLE, co oznacza, że nie ma standardowego wyjścia. Jest emulowany przez tkinter. Fizycznie nie obsługuje bajtów. W tym przypadku .decode('UTF-8', errors='replace')twój ciąg lub uruchom, python3 -I <filename>aby uzyskać REPL zamiast używać IDLE.
stderrjeśli używasz razem z print(file=sys.stderr).
import os
os.write(1, a.tostring())
lub, os.write(sys.stdout.fileno(), …)jeśli to jest bardziej czytelne niż 1dla Ciebie.
os.writepolega na tym, że będziesz musiał sprawdzić zwracaną wartość, ponieważ nie gwarantuje to, że wszystko zostanie zapisane.
Idiomatyczny sposób na zrobienie tego, który jest dostępny tylko dla Pythona 3, to:
with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
stdout.write(b"my bytes object")
stdout.flush()
Zaletą jest to, że używa normalnego interfejsu obiektu pliku, do którego wszyscy są przyzwyczajeni w Pythonie.
Zwróć uwagę, że ustawiam closefd=Falseunikanie zamykania sys.stdoutpodczas wychodzenia z withbloku. W przeciwnym razie Twój program nie będzie mógł już drukować na standardowe wyjście. Jednak w przypadku deskryptorów plików innego rodzaju możesz pominąć tę część.
W przypadku, gdy chcesz określić kodowanie w python3, nadal możesz użyć polecenia bajtów, jak poniżej:
import os
os.write(1,bytes('Your string to Stdout','UTF-8'))
gdzie 1 jest odpowiednią zwykłą liczbą dla stdout -> sys.stdout.fileno ()
W przeciwnym razie, jeśli nie zależy Ci na kodowaniu, po prostu użyj:
import sys
sys.stdout.write("Your string to Stdout\n")
Jeśli chcesz używać os.write bez kodowania, spróbuj użyć poniższego:
import os
os.write(1,b"Your string to Stdout\n")
os.write(sys.stdout.fileno(), some_bytes)nie będą działać w IDLE. io.UnsupportedOperation: fileno
stdout, ostatnim.