web-dev-qa-db-fra.com

Comment écrire des données binaires sur 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?

73
Ivan Baldin

Une meilleure façon:

import sys
sys.stdout.buffer.write(b"some binary data")
122
import os
os.write(1, a.tostring())

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

11
Alex Martelli

Si vous souhaitez spécifier un codage 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 à 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 l'encodage, essayez d'utiliser les éléments ci-dessous:

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

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

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

La bonne partie est qu’il utilise l’interface objet-fichier normale, à laquelle tout le monde est habitué en Python.

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

0
Yajo