134 votes

Comment écrire des données binaires à stdout en python 3 ?

En python 2.x je pourrais faire ceci :

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

Maintenant, cependant, je reçois un TypeError: can't write bytes to text stream. Y a-t-il un encodage secret que je devrais utiliser ?

213voto

Benjamin Peterson Points 5277

Une meilleure façon :

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

16voto

Alex Martelli Points 330805
import os
os.write(1, a.tostring())

ou, os.write(sys.stdout.fileno(), …) si c'est plus lisible que 1 pour vous.

15voto

Yajo Points 62

Une façon idiomatique de le faire, qui n'est disponible que pour Python 3, est :

with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
    stdout.write(b"my bytes object")
    stdout.flush()

Le bon côté est qu'il utilise l'interface d'objet de fichier normal, auquel tout le monde est habitué dans Python.

Remarquez que je configure closefd=False pour éviter de fermer sys.stdout lorsque vous quittez le bloc with. Sinon, votre programme ne serait plus en mesure d'imprimer sur Stdout. Cependant, pour d'autres types de descripteurs de fichiers, vous pouvez sauter cette partie.

3voto

Marco smdm Points 668

Si vous souhaitez spécifier un encodage dans python3, vous pouvez toujours utiliser la commande bytes comme ci-dessous :

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

où 1 est le nombre habituel correspondant pour stdout --> sys.stdout.fileno()

Sinon, si vous ne vous souciez pas de l'encodage, utilisez simplement :

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

Si vous souhaitez utiliser os.write sans encodage, essayez d'utiliser ce qui suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X