2010-07-16 23 views
236

¿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)

+4

¿Qué versión de Python? 2.xo 3.x? –

+0

Honestamente, me gustaría saber de ambos, aunque no tengo experiencia con Python 3. Actualicé la pregunta. –

+9

@ 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

Respuesta

197

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 
+28

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'. –

+0

@Michael Mior: Es verdad, he dicho que" formatea las entradas ". Mejor respuesta mencionaría qué tipo de formateo. Gracias por la aclaración. – luc

+0

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

2

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.

98

"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') 
+23

+1 por mencionar el carácter de nueva línea! Esta es la principal diferencia entre 'print' y' .write() ', yo diría. – EOL

+7

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

+16

@EOL ¡Qué gracioso es eso! , que alguien llamado EOL hace un comentario sobre '\ n' ... Me hizo reír. No tengo vida. Mátame. – Depado

30

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

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.

+1

¿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

+0

Ya. Lo mismo es cierto con el uso de 'nohup' y la redirección a un archivo' .out'. –

23

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 
+0

¿Hay alguna manera para que pueda imprimir en la pantalla y escribir en el archivo? –

+3

@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

8

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

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.

5

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.

0

¿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) 
Cuestiones relacionadas