¿La diferencia entre sys.stdout.write y print?

¿Hay situaciones en las que es preferible print sys.stdout.write() ?

( Ejemplos: mejor rendimiento; código que tiene más sentido)

print es solo una envoltura delgada que formatea las entradas (modificable, pero por defecto con un espacio entre argumentos y nueva línea al final) y llama a la función de escritura de un objeto determinado. De forma predeterminada, este objeto es sys.stdout , pero puede pasar un archivo utilizando el formulario “chevron”. Por ejemplo:

 print >> open('file.txt', 'w'), 'Hello', 'World', 2+3 

Consulte: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


En Python 3.x, la print convierte en una función, pero aún es posible pasar algo más que sys.stdout gracias al argumento del file .

 print('Hello', 'World', 2+3, file=open('file.txt', 'w')) 

Consulte https://docs.python.org/3/library/functions.html#print


En Python 2.6+, la print sigue siendo una statement, pero se puede usar 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 statement de impresión (y más generalmente entre una función y una statement) señalada por Bakuriu en los comentarios.

En caso de error al evaluar 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 

print 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 en una cadena (llamando a “str”, por ejemplo) y no hay ningún carácter de nueva línea.

Asi que

 print 99 

es equivalente a:

 import sys sys.stdout.write(str(99) + '\n') 

Mi pregunta es si hay o no situaciones en las que sys.stdout.write() es preferible print

Después de terminar de desarrollar un script el otro día, lo subí a un servidor Unix. Todos mis mensajes de depuración utilizaron sentencias de print , y estas no aparecen en el registro del servidor.

Este es un caso en el que puede necesitar sys.stdout.write en sys.stdout.write lugar.

Aquí hay un código de ejemplo basado en el libro Learning Python por Mark Lutz que responde a 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 # restre print commands to interactive prompt print("back to normal") # this shows up in the interactive prompt 

Abrir log.txt en un editor de texto revelará lo siguiente:

 testing123 another line 

Hay al menos una situación en la que desea sys.stdout lugar de imprimir.

Cuando desea sobrescribir una línea sin pasar a la línea siguiente, por ejemplo, mientras dibuja una barra de progreso o un mensaje de estado , debe recorrer algo como

 Note carriage return-> "\rMy Status Message: %s" % progress 

Y como la impresión agrega una nueva línea, es mejor usar sys.stdout .

Mi pregunta es si hay o no situaciones en las que sys.stdout.write() es preferible print

Si está escribiendo una aplicación de línea de comandos que puede escribir tanto en archivos como en stdout, entonces es útil. Puedes 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() 

Significa que no puede usar el patrón with open(outfile, 'w') as out: patrón with open(outfile, 'w') as out: pero a veces vale la pena.

En 2.x, la statement de print procesa previamente lo que le das, convirtiéndolo en cadenas en el camino, manejando separadores y nuevas líneas, y permitiendo la redirección a un archivo. 3.x lo convierte en una función, pero aún tiene las mismas responsabilidades.

sys.stdout es un archivo o sys.stdout un archivo que tiene métodos para escribir en él que llevan cadenas o algo por el estilo.

¿Hay situaciones en las que es preferible imprimir sys.stdout.write ()?

Por ejemplo, estoy trabajando en una pequeña función que imprime estrellas en formato piramidal al pasar el número como argumento, aunque puede hacerlo usando end = “” para imprimir en una línea separada, usé sys.stdout.write en coordinación Con impresión para hacer este trabajo. Para elaborar más detalladamente, stdout.write imprime en la misma línea donde, al imprimir, 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 

¿Hay situaciones en las que es preferible imprimir sys.stdout.write ()?

He encontrado que la salida estándar funciona mejor que la impresión en una situación de subprocesos múltiples. Uso la Cola (FIFO) para almacenar las líneas a imprimir y sostengo todos los hilos antes de la línea de impresión hasta que mi Q de impresión esté vacía. Aun así, al usar Print, a veces pierdo el \ n final en la E / S de depuración (usando el IDE de wing pro).

Cuando uso std.out con \ n en la cadena, los formatos de E / S de depuración correctamente y los \ n se muestran con precisión.

En Python 3 hay una razón válida para usar la impresión sobre sys.stdout.write , pero esta razón también se puede convertir en una razón para usar sys.stdout.write en sys.stdout.write lugar.

Este es el motivo por el que, ahora, imprimir es una función en Python 3, puede anular esto. Por lo tanto, puede usar imprimir en cualquier lugar en un simple script y decidir que las declaraciones de impresión necesitan escribir en stderr lugar. Ahora puede simplemente redefinir la función de impresión, incluso podría cambiar la función de impresión global cambiándola utilizando el módulo incorporado. Por supuesto, con file.write puede especificar qué archivo es, pero al sobrescribir la impresión también puede file.write a definir el separador de línea o el separador de argumento.

La otra manera es. Tal vez esté absolutamente seguro de que escribe en stdout , pero también sabe que va a cambiar la impresión a otra cosa, puede optar por usar sys.stdout.write y usar la impresión para el registro de errores o cualquier otra cosa.

Entonces, lo que use depende de cómo pretenda usarlo. print es más flexible, pero eso puede ser una razón para usar y no usarla. Todavía optaría por la flexibilidad y elegir imprimir. Otra razón para usar la print es la familiaridad. Más personas sabrán lo que quiere decir con letra impresa y menos conocerán sys.stdout.write .

es preferible cuando la impresión dinámica es útil, por ejemplo, para proporcionar información en un proceso largo:

 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)