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ć?
python
python-3.x
Ivan Baldin
źródło
źródło
os.write
będzie działać zarówno na Py2, jak i Py3.Odpowiedzi:
Lepszy sposób:
źródło
sys.stdout.buffer
pozwala również robić takie rzeczy, jak używanie,shutil.copyfileobj
nawet jeśli obiekt pliku źródłowego podaje bajty, a nie łańcuchy. +1AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
uruchamia 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.stderr
jeśli używasz razem zprint(file=sys.stderr)
.lub,
os.write(sys.stdout.fileno(), …)
jeśli to jest bardziej czytelne niż1
dla Ciebie.źródło
os.write
polega 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:
Zaletą jest to, że używa normalnego interfejsu obiektu pliku, do którego wszyscy są przyzwyczajeni w Pythonie.
Zwróć uwagę, że ustawiam
closefd=False
unikanie zamykaniasys.stdout
podczas wychodzenia zwith
bloku. 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ęść.źródło
W przypadku, gdy chcesz określić kodowanie w python3, nadal możesz użyć polecenia bajtów, jak poniżej:
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:
Jeśli chcesz używać os.write bez kodowania, spróbuj użyć poniższego:
źródło
os.write(sys.stdout.fileno(), some_bytes)
nie będą działać w IDLE.io.UnsupportedOperation: fileno
stdout
, ostatnim.