En python 2.x, je pourrais faire ceci:
import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Maintenant, cependant, j'obtiens un TypeError: can't write bytes to text stream
. Y a-t-il un encodage secret que je devrais utiliser?
python
python-3.x
Ivan Baldin
la source
la source
os.write
fonctionnera à la fois sur Py2 et Py3.Réponses:
Une meilleure façon:
la source
sys.stdout.buffer
vous permet également d'effectuer des opérations telles que l'utilisationshutil.copyfileobj
même lorsque l'objet du fichier source donne des octets et non des chaînes. +1AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
pythonw.exe
exécute IDLE, ce qui signifie qu'il n'y a pas de sortie standard. Il est émulé avec tkinter. Il ne peut physiquement pas gérer les octets. Dans ce cas,.decode('UTF-8', errors='replace')
votre chaîne, ou exécutezpython3 -I <filename>
pour obtenir un REPL au lieu d'utiliser IDLE.stderr
si vous utilisez avecprint(file=sys.stderr)
.ou,
os.write(sys.stdout.fileno(), …)
si c'est plus lisible que1
pour vous.la source
os.write
est que vous devrez vérifier la valeur de retour, car cela ne garantit pas que tout sera écrit.Une façon idiomatique de le faire, qui n'est disponible que pour Python 3, est:
L'avantage est qu'il utilise l'interface d'objet fichier normale, à laquelle tout le monde est habitué en Python.
Notez que je suis en train
closefd=False
de régler pour éviter de fermersys.stdout
lorsque je quitte lewith
bloc. Sinon, votre programme ne pourrait plus imprimer sur stdout. Cependant, pour d'autres types de descripteurs de fichiers, vous pouvez ignorer cette partie.la source
Si vous souhaitez spécifier un encodage en python3, vous pouvez toujours utiliser la commande bytes comme ci-dessous:
où 1 est le nombre habituel correspondant pour stdout -> sys.stdout.fileno ()
Sinon, si vous ne vous souciez pas de l'encodage, utilisez simplement:
Si vous souhaitez utiliser os.write sans encodage, essayez d'utiliser ce qui suit:
la source
os.write(sys.stdout.fileno(), some_bytes)
ne fonctionneront pas en IDLE.io.UnsupportedOperation: fileno
stdout
, la dernière.