In Python 2.x könnte ich das tun:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Jetzt bekomme ich jedoch eine TypeError: can't write bytes to text stream
. Gibt es eine geheime Codierung, die ich verwenden sollte?
python
python-3.x
Ivan Baldin
quelle
quelle
os.write
wird sowohl auf Py2 als auch auf Py3 funktionieren.Antworten:
Ein besserer Weg:
quelle
sys.stdout.buffer
können Sie auch Dinge verwenden, die verwendet werden,shutil.copyfileobj
selbst wenn das Quelldateiobjekt Bytes und keine Zeichenfolgen enthält. +1AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
führt IDLE aus, was bedeutet, dass kein Standard vorhanden ist. Es wird mit tkinter emuliert. Es kann physisch keine Bytes verarbeiten. In diesem Fall.decode('UTF-8', errors='replace')
Ihre Zeichenfolge oder ausführenpython3 -I <filename>
, um eine REPL zu erhalten, anstatt IDLE zu verwenden.stderr
wenn sie zusammen mit verwendet werdenprint(file=sys.stderr)
.oder,
os.write(sys.stdout.fileno(), …)
wenn das besser lesbar ist als1
für Sie.quelle
os.write
ist, dass Sie den Rückgabewert überprüfen müssen, da dies nicht garantiert, dass alles geschrieben wird.Eine idiomatische Methode, die nur für Python 3 verfügbar ist, ist:
Das Gute daran ist, dass es die normale Dateiobjektschnittstelle verwendet, an die jeder in Python gewöhnt ist.
Beachten Sie, dass ich beim
closefd=False
Schließensys.stdout
deswith
Blocks ein Schließen vermeiden möchte . Andernfalls kann Ihr Programm nicht mehr auf Standard drucken. Bei anderen Arten von Dateideskriptoren können Sie diesen Teil jedoch überspringen.quelle
Wenn Sie eine Codierung in Python3 angeben möchten, können Sie den folgenden Byte-Befehl weiterhin verwenden:
Dabei ist 1 die entsprechende übliche Zahl für stdout -> sys.stdout.fileno ()
Andernfalls, wenn Sie sich nicht für die Codierung interessieren, verwenden Sie einfach:
Wenn Sie os.write ohne Codierung verwenden möchten, versuchen Sie, Folgendes zu verwenden:
quelle
os.write(sys.stdout.fileno(), some_bytes)
, funktionieren in IDLE nicht.io.UnsupportedOperation: fileno
stdout
, die letzte.