2009-05-25 13 views
53

En Python 2.x que podía hacer esto:¿Cómo escribir datos binarios en stdout en python 3?

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

Ahora, sin embargo, aparece un TypeError: can't write bytes to text stream. ¿Hay alguna codificación secreta que deba usar?

+3

Sería mucho mejor encontrar una respuesta que va a trabajar con Python 2.6+ y 3. x – sorin

+1

'os.write' funcionará tanto en Py2 como en Py3. –

Respuesta

90

Una mejor manera:

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

El uso de 'sys.stdout.buffer' también le permite hacer cosas como usar' shutil.copyfileobj' incluso cuando el objeto del archivo de origen da bytes y no cadenas. +1 – csl

+0

Los programas que usan esto no se pueden probar en IDLE 3: 'AttributeError: 'PseudoOutputFile' objeto no tiene atributo 'buffer'' –

+0

@DamianYerrick en IDLE (en Windows al menos)' pythonw.exe' ejecuta IDLE, lo que significa que no hay stdout Se emula con tkinter. No puede manejar físicamente bytes. En este caso, '.decode ('UTF-8', errors = 'replace')' su cadena, o ejecute 'python3 -I ' para obtener un REPL en lugar de usar IDLE. – Artyer

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

o, os.write(sys.stdout.fileno(), …) si eso es más legible que 1 para usted.

+0

Gracias, eso funcionó. Se siente un poco hack-ish, pero supongo que no es algo común de hacer. –

+4

El problema con 'os.write' es que tendrá que verificar el valor devuelto, ya que no garantiza que todo se escriba. –

0

En caso de que desee para especificar una codificación en python3 puede seguir utilizando los bytes de comando, como a continuación:

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

donde 1 es el número habitual correspondientes para stdout -> sys.stdout.fileno()

De lo contrario, si no le importa la codificación simplemente use:

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

Si desea utilizar el os.write sin la codificación, a continuación, intente utilizar el siguiente:

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

Los programas que usan 'os.write (sys.stdout.fileno(), some_bytes)' no funcionarán en IDLE. 'io.UnsupportedOperation: fileno' –

+0

@DamianYerrick: Tiene usted razón ... el IDLE no debería usarse de todos modos para probar algo así. En breve: intente abrir el IDLE (tuve el shell python3.5.1) y simplemente import sys y sys.stdout.fileno() le arrojará io error, porque en IDLE esto no es compatible con la operación :-) Siempre es importante recordar en qué entorno estás trabajando e intentar obtener lo que es posible;) Espero que esto aclare tu consulta :-) Que tengas un buen fin de semana. –

Cuestiones relacionadas