Existe-t-il des situations dans lesquelles sys.stdout.write()
est préférable à print
?
(Exemples: meilleures performances; un code plus logique)
print
est juste un fin wrapper qui formate les entrées (modifiable, mais par défaut avec un espace entre les arguments et les nouvelles lignes à la fin) et appelle la fonction write d'un objet donné. Par défaut, cet objet est sys.stdout
, mais vous pouvez transmettre un fichier en utilisant le formulaire "chevron". Par exemple:
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
Voir: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
Dans Python 3.x, print
devient une fonction, mais il est toujours possible de passer autre chose que sys.stdout
grâce à l'argument file
.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
Voir https://docs.python.org/3/library/functions.html#print
Dans Python 2.6+, print
est toujours une instruction, mais il peut être utilisé comme une fonction avec
from __future__ import print_function
Mise à jour: Bakuriu a fait remarquer qu'il y avait une petite différence entre la fonction print et l'instruction print (et plus généralement entre une fonction et une instruction).
En cas d'erreur lors de l'évaluation des arguments:
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called
print
convertit d'abord l'objet en une chaîne (s'il ne s'agit pas déjà d'une chaîne). Il mettra également un espace avant l'objet si ce n'est pas le début d'une ligne et un caractère de nouvelle ligne à la fin.
Lorsque vous utilisez stdout
, vous devez convertir vous-même l'objet en chaîne (en appelant "str", par exemple) et il n'y a pas de caractère de nouvelle ligne.
Alors
print 99
est équivalent à:
import sys
sys.stdout.write(str(99) + '\n')
Ma question est de savoir s'il existe ou non des situations dans lesquelles
sys.stdout.write()
est préférable à
Après avoir fini de développer un script l'autre jour, je l'ai téléchargé sur un serveur Unix. Tous mes messages de débogage utilisaient des instructions print
, et celles-ci ne le font pas apparaissent dans un journal du serveur.
Dans ce cas, vous aurez peut-être besoin de sys.stdout.write
.
Voici un exemple de code basé sur le livre Learning Python de Mark Lutz qui répond à votre question:
import sys
temp = sys.stdout # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123") # nothing appears at interactive Prompt
print("another line") # again nothing appears. it's written to log file instead
sys.stdout.close() # ordinary file object
sys.stdout = temp # restore print commands to interactive Prompt
print("back to normal") # this shows up in the interactive Prompt
Ouvrir log.txt dans un éditeur de texte révélera les éléments suivants:
testing123
another line
Il existe au moins une situation dans laquelle vous souhaitez sys.stdout
au lieu de l’impression.
Lorsque vous souhaitez écraser une ligne sans passer à la ligne suivante, par exemple en dessinant une barre de progression ou un message d'état, vous devez effectuer une boucle comme par exemple
Note carriage return-> "\rMy Status Message: %s" % progress
Et comme print ajoute une nouvelle ligne, il vaut mieux utiliser sys.stdout
.
Ma question est de savoir s'il existe ou non des situations dans lesquelles
sys.stdout.write()
est préférable à
Si vous écrivez une application en ligne de commande capable d’écrire à la fois sur des fichiers et sur stdout, c’est pratique. Vous pouvez faire des choses comme:
def myfunc(outfile=None):
if outfile is None:
out = sys.stdout
else:
out = open(outfile, 'w')
try:
# do some stuff
out.write(mytext + '\n')
# ...
finally:
if outfile is not None:
out.close()
Cela signifie que vous ne pouvez pas utiliser le motif with open(outfile, 'w') as out:
, mais parfois cela en vaut la peine.
Dans la version 2.x, l'instruction print
pré-traite ce que vous lui donnez, la transformant en chaînes le long du chemin, gérant les séparateurs et les nouvelles lignes et permettant la redirection vers un fichier. 3.x le transforme en une fonction, mais il a toujours les mêmes responsabilités.
sys.stdout
est un fichier ou un fichier qui possède des méthodes pour l'écriture, qui prennent des chaînes ou quelque chose le long de cette ligne.
Existe-t-il des situations dans lesquelles sys.stdout.write () est préférable d’imprimer?
J'ai trouvé que stdout fonctionne mieux que print dans une situation de multithreading. J'utilise la file d'attente (FIFO) pour stocker les lignes à imprimer et je conserve tous les fils avant la ligne d'impression jusqu'à ce que mon Q d'impression soit vide. Malgré cela, en utilisant print, je perds parfois le dernier\n sur les E/S de débogage (avec wing pro IDE).
Lorsque j'utilise std.out avec\n dans la chaîne, les formats d'E/S de débogage et les\n s'affichent correctement.
Existe-t-il des situations dans lesquelles sys.stdout.write () est préférable d’imprimer?
Par exemple, je travaille sur une petite fonction qui imprime des étoiles au format pyramide en passant le nombre en argument, bien que vous puissiez le faire en utilisant end = "" pour imprimer sur une ligne séparée, j’ai utilisé sys.stdout.write en coordination avec print pour que cela fonctionne. Pour élaborer sur ceci stdout.write imprime dans la même ligne que print imprime toujours son contenu sur une ligne séparée.
import sys
def printstars(count):
if count >= 1:
i = 1
while (i <= count):
x=0
while(x<i):
sys.stdout.write('*')
x = x+1
print('')
i=i+1
printstars(5)
il est préférable, lorsque l’impression dynamique est utile, par exemple, de donner des informations dans un long processus:
import time, sys
Iterations = 555
for k in range(Iterations+1):
# some code to execute here ...
percentage = k / Iterations
time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
sys.stdout.write(time_msg)
sys.stdout.flush()
time.sleep(0.01)
Dans Python 3, il existe une raison valable d'utiliser print sur sys.stdout.write
, mais cette raison peut également être transformée en une raison d'utiliser sys.stdout.write
à la place.
Cette raison est que, maintenant, print est une fonction dans Python 3, vous pouvez le remplacer. Vous pouvez donc utiliser print partout dans un script simple et décider que les instructions print doivent écrire à stderr
à la place. Vous pouvez maintenant simplement redéfinir la fonction d'impression, vous pouvez même changer la fonction d'impression globale en la modifiant à l'aide du module builtins. Bien sûr, avec file.write
, vous pouvez spécifier le fichier, mais en écrasant l'impression, vous pouvez également redéfinir le séparateur de lignes ou le séparateur d'arguments.
Le contraire est. Peut-être que vous êtes absolument certain d'écrire sur stdout
, mais que vous savez également que vous allez modifier l'impression, vous pouvez décider d'utiliser sys.stdout.write
et d'utiliser print pour le journal des erreurs ou autre chose.
Donc, ce que vous utilisez dépend de la façon dont vous avez l’intention de l’utiliser. print
est plus flexible, mais cela peut être une raison d'utiliser et de ne pas l'utiliser. Je préférerais quand même opter pour la flexibilité et choisir l’impression. Une autre raison d'utiliser print
à la place est la familiarité. Plus de gens vont maintenant comprendre ce que vous voulez dire par écrit et moins vous en savez sys.stdout.write
.
>>> sys.stdout.write(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1
En observant l'exemple ci-dessus:
sys.stdout.write
n'écrira pas d'objet non-chaîne, mais print
sys.stdout.write
n’ajoutera pas de nouveau symbole de ligne à la fin, mais print
Si nous plongeons profondément,
sys.stdout
est un objet fichier pouvant être utilisé pour la sortie de print ()
si l'argument de fichier de print()
n'est pas spécifié, sys.stdout
sera utilisé