print - sys stdout write() in python
¿La diferencia entre sys.stdout.write y print? (11)
¿Hay situaciones en las que es preferible imprimir sys.stdout.write ()?
He descubierto que la salida estándar funciona mejor que la impresión en una situación de subprocesos múltiples. Utilizo 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 la / n final en la E / S de depuración (usando wing pro IDE).
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.
¿Hay situaciones en las que es preferible print
sys.stdout.write()
?
( Ejemplos: mejor rendimiento; código que tiene más sentido)
¿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 más detalles sobre esto, 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<i):
sys.stdout.write(''*'')
x = x+1
print('''')
i=i+1
printstars(5)
Mi pregunta es si hay o no situaciones en las que
sys.stdout.write()
es preferible
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.
Mi pregunta es si hay o no situaciones en las que
sys.stdout.write()
es preferible
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.
"imprimir" primero convierte el objeto en una cadena (si aún no es una cadena). También colocará un espacio antes del objeto si no es el comienzo de una línea y un carácter de nueva línea al final.
Cuando use 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'')
Aquí hay un ejemplo de código 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 # restore 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
En 2.x, la declaración de print
preprocesa 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.
En Python 3, existe 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.
Esta razón es que, ahora, imprimir es una función en Python 3, puede anular esta opción. 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 alguna otra cosa.
Entonces, lo que uses depende de cómo intentes 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 en su lugar, y elegir imprimir. Otra razón para usar la print
es la familiaridad. Más personas sabrán ahora lo que quiere decir con letra impresa y menos conocerán sys.stdout.write
.
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 siguiente, por ejemplo, mientras dibuja una barra de progreso o un mensaje de estado , debe pasar 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
.
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)
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 declaración, 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 declaración de impresión (y más generalmente entre una función y una declaración) 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