¿Hay situaciones en las que sys.stdout.write()
es preferible a print
?¿La diferencia entre sys.stdout.write e print?
(Ejemplos: mejor rendimiento; código que tiene más sentido)
¿Hay situaciones en las que sys.stdout.write()
es preferible a print
?¿La diferencia entre sys.stdout.write e print?
(Ejemplos: mejor rendimiento; código que tiene más sentido)
print
es sólo un envoltorio delgado que da formato a las entradas (el espacio entre los argumentos y nueva línea al final) y llama a la función de escritura de un objeto dado Por defecto, este objeto es sys.stdout
, pero puede pasar un archivo usando el formulario "chevron". Por ejemplo:
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
Ver: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
En Python 3.x, print
se convierte en una función, pero todavía es posible pasar algo más que sys.stdout
gracias al argumento file
.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
Ver https://docs.python.org/3/library/functions.html#print
En Python 2.6+, print
sigue siendo un comunicado, pero se puede utilizar como una función con
from __future__ import print_function
Actualización: Hay una pequeña diferencia entre la función de impresión y la declaración de impresión (y más generalmente entre una función y tatement) señalado por Bakuriu en los comentarios.
En caso de error en la evaluación de argumentos:
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The func is not called
También vale la pena señalar que ' print' también agrega una nueva línea a lo que sea que escriba, lo que no ocurre con 'sys.stdout.write'. –
@Michael Mior: Es verdad, he dicho que" formatea las entradas ". Mejor respuesta mencionaría qué tipo de formateo. Gracias por la aclaración. – luc
También 'sys.stdout.write' es más universal si alguna vez necesita escribir dual-versi en el código (p. código que funciona simultáneamente con Python 2.x y Python 3.x). – andreb
En 2.x, la declaración print
Preprocesa lo que se le dé, convirtiéndolo en cadenas a lo largo del camino, el manejo de los separadores y saltos de línea, y permitiendo la redirección a un archivo. 3.x lo convierte en una función, pero todavía tiene las mismas responsabilidades.
sys.stdout
es un archivo o archivo que tiene métodos para escribir que toman cadenas o algo por el estilo.
"imprimir" primero convierte el objeto en una cadena (si aún no es una cadena). También pondrá un espacio antes del objeto si no es el comienzo de una línea y un carácter de nueva línea al final.
Al usar stdout, necesita convertir el objeto a una cadena usted mismo (llamando a "str", por ejemplo) y no hay carácter de nueva línea.
Así
print 99
es equivalente a:
import sys
sys.stdout.write(str(99) + '\n')
+1 por mencionar el carácter de nueva línea! Esta es la principal diferencia entre 'print' y' .write() ', yo diría. – EOL
NOTA: 'print' se puede hacer para omitir la nueva línea. En Python 2.x, ponga una coma al final, y se generará un carácter de espacio, pero no línea nueva. P.ej. 'print 99,' En Python 3, 'print (..., end = '')' evitará añadir newline (y también evitará agregar espacio, a menos que haga 'end = '''. – ToolmakerSteve
@EOL ¡Qué gracioso es eso! , que alguien llamado EOL hace un comentario sobre '\ n' ... Me hizo reír. No tengo vida. Mátame. – Depado
Mi pregunta es si o no hay situaciones en las que
sys.stdout.write()
es preferible
Después de terminar el desarrollo de una script el otro día, lo cargué en un servidor Unix. Todos mis mensajes de depuración usaron declaraciones print
, y estas no aparecen en el registro del servidor.
Este es un caso en el que puede necesitar sys.stdout.write
en su lugar.
¿eh? ¿Estás seguro de que esta es una diferencia entre 'print()' y 'sys.stdout.write()', a diferencia de la diferencia entre 'stdout' y' stderr'? Para la depuración, debe usar el módulo 'logging', que imprime mensajes a' stderr'. – ostrokach
Ya. Lo mismo es cierto con el uso de 'nohup' y la redirección a un archivo' .out'. –
He aquí algunos ejemplos de código basada en el libro de aprendizaje de Python por Mark Lutz que se ocupa de su pregunta:
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
Apertura registro.txt en un editor de texto revelará lo siguiente:
testing123
another line
¿Hay alguna manera para que pueda imprimir en la pantalla y escribir en el archivo? –
@DeveshSaini: Sí, simplemente sobrescriba sys.stdout con una clase proxy que tenga al menos una función write() y flush(). Escribí un fragmento de ejemplo [aquí] (http://hastebin.com/owijihizus.py). – ponycat
Mi pregunta es si hay o no situaciones en las que
sys.stdout.write()
es preferible a
Si está escribiendo una aplicación de línea de comandos que puede escribir tanto en archivos como en stdout, es útil. Puede hacer cosas como:
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()
Lo que significa que no puede utilizar el patrón with open(outfile, 'w') as out:
, pero a veces vale la pena.
Hay al menos una situación en la que desea sys.stdout
en lugar de imprimir.
Cuando desea sobrescribir una línea sin tener que pasar a la siguiente línea, por ejemplo mientras se dibuja una barra de progreso o un mensaje de estado, es necesario un bucle sobre algo así como
Note carriage return-> "\rMy Status Message: %s" % progress
Y puesto que la impresión se suma una nueva línea, es mejor usar sys.stdout
.
¿Hay situaciones en las que sys.stdout.write() es preferible a imprimir?
Por ejemplo, yo estoy trabajando en un evento pequeño que imprime estrellas en formato de pirámide cuando haya superado el número como argumento, aunque se puede lograr esto usando final = "" para imprimir en una línea separada, yo utilizado sys.stdout.write en coordinación con de impresión para hacer este trabajo. Para más detalles sobre este stdout.escriba imprime en la misma línea donde imprime siempre imprime su contenido en una línea separada.
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)
¿Qué versión de Python? 2.xo 3.x? –
Honestamente, me gustaría saber de ambos, aunque no tengo experiencia con Python 3. Actualicé la pregunta. –
@ S.Lott: preguntar por las diferencias básicas entre 'sys.stdout.write()' y 'print' (y/o por qué Python tiene ambas) es una pregunta perfectamente razonable y no necesita ejemplos. OP no dijo que la sintaxis del comando era confusa. – smci