Me gustaría hacer varias declaraciones que den salida estándar sin ver nuevas líneas entre las declaraciones.
Específicamente, supongamos que tengo:
for item in range(1,100):
print item
El resultado es:
1
2
3
4
.
.
.
Cómo hacer que esto se vea así:
1 2 3 4 5 ...
Aún mejor, ¿es posible imprimir el número único sobre el último número, por lo que solo hay un número en la pantalla a la vez?
Respuestas:
Cambiar
print item
a:print item,
en Python 2.7print(item, end=" ")
en Python 3Si desea imprimir los datos dinámicamente, use la siguiente sintaxis:
print(item, sep=' ', end='', flush=True)
en Python 3fuente
'\n'
escribe un carácter al final, a menos que laprint
declaración termine con una coma. Esta es la única acción si la declaración contiene solo la palabra claveprint
.flush
no funcionafrom __future__ import print_function
.print(item, end=", ")
, entonces también agrega,
al último elemento cómo evitar que se agregue,
al último elementoEn general, la forma de hacerlo es con códigos de control de terminal . Este es un caso particularmente simple, para el que solo necesita un carácter especial: U + 000D CARRIAGE RETURN, que está escrito
'\r'
en Python (y en muchos otros idiomas). Aquí hay un ejemplo completo basado en su código:Algunas cosas sobre esto que pueden ser sorprendentes:
\r
va al principio de la cadena de manera que, mientras que el programa se está ejecutando, el cursor siempre será después del número. Esto no es solo cosmético: algunos emuladores de terminal se confunden mucho si lo hace al revés.stdout.flush
es necesaria en algunos sistemas, o no se va a ninguna salida. Otros sistemas pueden no requerirlo, pero no hace ningún daño.Si encuentra que esto no funciona, lo primero que debe sospechar es que su emulador de terminal tiene errores. El mejor programa puede ayudarlo a probarlo.
Puede reemplazar el
stdout.write
con unaprint
declaración, pero prefiero no mezclarloprint
con el uso directo de objetos de archivo.fuente
flush()
obliga a un archivo a enviar lo que sea que tenga al sistema operativo en este momento. Me sorprende que funcione para ti sin eso, no funcionó para mí hasta que lo agregué.ncurses
.sys.stdout.flush()
parece ser obligatorio en miFreebsd
conPython 2.7
Use
print item,
para hacer que la declaración de impresión omita la nueva línea.En Python 3, es
print(item, end=" ")
.Si desea que cada número se muestre en el mismo lugar, use por ejemplo (Python 2.7):
En Python 3, es un poco más complicado; aquí necesita enjuagar
sys.stdout
o no imprimirá nada hasta que el ciclo haya terminado:fuente
Al igual que los otros ejemplos,
utilizo un enfoque similar, pero en lugar de perder tiempo calculando la última longitud de salida, etc.
Simplemente uso los escapes de código ANSI para volver al principio de la línea y luego borrar esa línea completa antes de imprimir mi salida de estado actual.
Para usar en su ciclo de iteración simplemente llamaría algo como:
Ver más aquí
fuente
Puede agregar una coma final a su declaración de impresión para imprimir un espacio en lugar de una nueva línea en cada iteración:
Alternativamente, si está usando Python 2.6 o posterior, puede usar la nueva función de impresión, que le permitiría especificar que ni siquiera debería aparecer un espacio al final de cada elemento que se está imprimiendo (o le permitirá especificar el final que desee). querer):
Finalmente, puede escribir directamente en la salida estándar importándola desde el módulo sys, que devuelve un objeto similar a un archivo:
fuente
cambio
a
fuente
\033[K
código? Me gustaría aprender más sobre ellos.print
Ya se sonroja internamente. No hay necesidad de llamarlo.print
es diferente desys.stdout.write()
donde tienes que descargar la pantallaCreo que una combinación simple debería funcionar:
fuente
print ' '.join(str(x) for x in range(1, 10))
.Otra respuesta que estoy usando en 2.7 donde solo estoy imprimiendo un "." cada vez que se ejecuta un bucle (para indicar al usuario que las cosas aún se están ejecutando) es esto:
Imprime el "." personajes sin espacios entre cada uno. Se ve un poco mejor y funciona bastante bien. El \ b es un carácter de retroceso para aquellos que se preguntan.
fuente
Tantas respuestas complicadas. Si tiene Python 3, simplemente colóquelo
\r
al comienzo de la impresión y agrégueloend='', flush=True
:Esto escribirá
0 foo bar
, luego1 foo bar
, etc., en el lugar.fuente
print('\r' + filename + " ", end = '', flush=True)
Para que los números se sobrescriban entre sí, puede hacer algo como esto:
Eso debería funcionar siempre que el número se imprima en la primera columna.
EDITAR: Aquí hay una versión que funcionará incluso si no está impresa en la primera columna.
Debo señalar que este código fue probado y funciona bien en Python 2.5 en Windows, en la consola de Windows. Según algunos otros, puede ser necesario el enjuague de stdout para ver los resultados. YMMV.
fuente
"Por cierto ...... Cómo actualizarlo cada vez para que imprima mi en un solo lugar simplemente cambie el número".
Es un tema realmente complicado. Lo que sugirió zack (generar códigos de control de consola) es una forma de lograrlo.
Puede usar (n) maldiciones, pero eso funciona principalmente en * nixes.
En Windows (y aquí va la parte interesante) que rara vez se menciona (no entiendo por qué) puede usar enlaces de Python a WinAPI ( http://sourceforge.net/projects/pywin32/ también con ActivePython de forma predeterminada) - no así de duro y funciona bien. Aquí hay un pequeño ejemplo:
O, si desea usar
print
(declaración o función, no hay diferencia):win32console
El módulo le permite hacer muchas cosas más interesantes con la consola de Windows ... No soy un gran admirador de WinAPI, pero recientemente me di cuenta de que al menos la mitad de mi antipatía hacia él fue causada por escribir código WinAPI en C - los enlaces pitónicos son Mucho más fácil de usar.Todas las demás respuestas son geniales y pitónicas, por supuesto, pero ... ¿Y si quisiera imprimir en la línea anterior ? ¿O escribir texto multilínea, que borrarlo y volver a escribir las mismas líneas? Mi solución lo hace posible.
fuente
para Python 2.7
para Python 3
fuente
fuente
Si solo desea imprimir los números, puede evitar el bucle.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 tomó 21.1986929975ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 tomó 491.466823551 ms
fuente
map
.La mejor manera de lograr esto es usar el
\r
personajeSolo prueba el siguiente código:
fuente
En Python 3 puedes hacerlo de esta manera:
Salidas:
Tupla: Puedes hacer lo mismo con una tupla:
Salidas:
Otro ejemplo:
Salidas:
Incluso puedes desempacar tu tupla así:
Salidas:
otra variante:
Salidas:
fuente
Una coma al final de la declaración de impresión omite la nueva línea.
pero esto no sobrescribe.
fuente
Para aquellos que luchaban como lo hice, se me ocurrió lo siguiente que parece funcionar tanto en Python 3.7.4 como en 3.5.2.
Amplié el rango de 100 a 1,000,000 porque se ejecuta muy rápido y es posible que no vea la salida. Esto se debe a que un efecto secundario de la configuración
end='\r'
es que la iteración del bucle final borra toda la salida. Se necesitaba un número más largo para demostrar que funciona. Este resultado puede no ser deseable en todos los casos, pero estuvo bien en el mío, y OP no especificó de una manera u otra. Usted podría eludir esto con una sentencia if que evalúa la longitud del ser gama repiten a lo largo, etc. La clave para conseguir que funcione en mi caso era para acoplar los soportes"{}"
con.format()
. De lo contrario, no funcionó.A continuación debería funcionar como está:
fuente
Salida: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
fuente
O incluso más simple:
end="\r"
sobrescribirá desde el principio [0:] de la primera impresión.fuente