2009-05-25 22 views
53

In Python 2.x konnte ich dies tun:Wie schreibe ich binäre Daten in stdout in Python 3?

import sys, array 
a = array.array('B', range(100)) 
a.tofile(sys.stdout)

aber jetzt bekomme ich ein TypeError: can't write bytes to text stream. Gibt es eine geheime Verschlüsselung, die ich verwenden sollte?

+3

Es wäre viel besser, eine Antwort zu finden, die mit Python 2.6+ und 3 funktionieren. x – sorin

+1

'os.write' funktioniert sowohl mit Py2 als auch mit Py3. –

Antwort

90

Eine bessere Art:

import sys 
sys.stdout.buffer.write(b"some binary data") 
+3

Mit 'sys.stdout.buffer' können Sie auch' 'shuthil.copyfileobj' 'verwenden, auch wenn das Quelldateiobjekt Bytes und keine Zeichenfolgen enthält. +1 – csl

+0

Programme, die dies verwenden, können nicht in IDLE 3 getestet werden: 'AttributeError: 'PseudoOutputFile' Objekt hat kein Attribut 'buffer'' –

+0

@DamianYerrick in IDLE (zumindest in Windows)' pythonw.exe' läuft IDLE, was bedeutet dass es kein stdout gibt. Es wird mit tkinter emuliert. Es kann physikalisch nicht mit Bytes umgehen. In diesem Fall '.decode ('UTF-8', errors = 'replace')' Ihre Zeichenfolge, oder führen Sie 'python3 -I ' aus, um eine REPL zu erhalten, anstatt IDLE zu verwenden. – Artyer

10
import os 
os.write(1, a.tostring()) 

oder os.write(sys.stdout.fileno(), …) wenn das besser lesbar als 1 für Sie.

+0

Danke, das hat funktioniert. Fühlt sich ein wenig hack-isch, aber ich denke, es ist nicht so üblich. –

+4

Das Problem mit 'os.write' ist, dass Sie den Rückgabewert überprüfen müssen, da es nicht garantiert, dass alles geschrieben wird. –

0

Falls möchten Sie eine Codierung in python3 geben Sie noch die Bytes wie unter Befehl verwenden können:

import os 
os.write(1,bytes('Your string to Stdout','UTF-8')) 

wobei 1 die entsprechende übliche Zahl für stdout -> sys.stdout.fileno()

Andernfalls, wenn Sie nicht für die Codierung kümmern nur verwenden:

import sys 
sys.stdout.write("Your string to Stdout\n") 

Wenn Sie die os.write ohne Codierung verwenden möchten, dann versuchen Sie unten zu verwenden:

import os 
os.write(1,b"Your string to Stdout\n") 
+0

Programme mit 'os.write (sys.stdout.fileno(), some_bytes)' funktionieren nicht in IDLE. 'io.UnsupportedOperation: fileno' –

+0

@DamianYerrick: Du hast Recht ... die IDLE sollte sowieso nicht benutzt werden, um so etwas zu testen. Kurz: versuche, die IDLE zu öffnen (ich hatte die Shell python3.5.1) und importiere einfach sys und sys.stdout.fileno() es wird dir einen Fehler liefern, weil es in IDLE nicht unterstützt wird :-) Es ist immer wichtig sich daran zu erinnern, in welcher Umgebung man arbeitet und versuchen zu bekommen, was möglich ist;) Hoffe, das klären Sie Ihre Anfrage :-) Habt ein schönes Wochenende. –

Verwandte Themen