2009-05-25 10 views
53

2.x python que je pouvais faire ceci:Comment écrire des données binaires dans stdout dans python 3?

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 codage secret que je devrais utiliser?

+3

Il serait préférable de trouver une réponse qui fonctionne avec Python 2.6+ et 3. x – sorin

+1

'os.write' fonctionnera à la fois sur Py2 et sur Py3. –

Répondre

90

Une meilleure façon:

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

L'utilisation de 'sys.stdout.buffer' vous permet également de faire quelque chose comme utiliser' shutil.copyfileobj' même si l'objet fichier source donne des octets, et non des chaînes. +1 – csl

+0

Les programmes utilisant ceci ne peuvent pas être testés dans IDLE 3: 'AttributeError: l'objet 'PseudoOutputFile' n'a pas d'attribut 'buffer'' –

+0

@DamianYerrick dans IDLE (dans Windows au moins)' pythonw.exe' exécute IDLE, ce qui signifie qu'il n'y a pas de stdout. Il est émulé avec tkinter. Il ne peut pas gérer physiquement les octets. Dans ce cas, '.decode ('UTF-8', errors = 'replace')' votre chaîne, ou exécutez 'python3 -I ' pour obtenir une REPL au lieu d'utiliser IDLE. – Artyer

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

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

+0

Merci, cela a fonctionné. On se sent un peu hack-ish mais je suppose que ce n'est pas chose courante. –

+4

Le problème avec 'os.write' est que vous devrez vérifier la valeur de retour, car il ne garantit pas que tout sera écrit. –

0

Si vous souhaitez spécifier un encodage en python3 vous pouvez toujours utiliser les octets commande 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 voulez utiliser le os.write sans l'encodage, essayez d'utiliser le ci-dessous:

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

Les programmes utilisant 'os.write (sys.stdout.fileno(), some_bytes)' ne fonctionneront pas dans IDLE. 'io.UnsupportedOperation: fileno' –

+0

@DamianYerrick: Vous avez raison ... le IDLE ne devrait pas être utilisé de toute façon pour tester quelque chose comme ça. En peu de temps: essayez d'ouvrir l'IDLE (j'ai eu le shell python3.5.1) et il suffit d'importer sys et sys.stdout.fileno() il va vous jeter une erreur, parce que dans IDLE ce n'est pas supporté opération :-) Il est toujours important se rappeler dans quel environnement vous travaillez et essayer d'obtenir ce qui est possible;) J'espère que cela clarifiera votre requête :-) Passez un bon week-end. –

Questions connexes