Si tuviera el siguiente código:
for x in range(10):
print x
Obtendría la salida de
1
2
etc..
Lo que me gustaría hacer es en lugar de imprimir una nueva línea, quiero reemplazar el valor anterior y sobrescribirlo con el nuevo valor en la misma línea.
Respuestas:
Una forma es utilizar el carácter de retorno de carro (
'\r'
) para volver al principio de la línea sin avanzar a la siguiente:La coma al final de la declaración de impresión le dice que no vaya a la siguiente línea. La última declaración de impresión avanza a la siguiente línea para que su mensaje no sobrescriba su salida final.
Actualizar
Ahora que Python 2 es EOL, una respuesta de Python 3 tiene más sentido. Para Python 3.5 y versiones anteriores:
En Python 3.6 y versiones posteriores, las cadenas f se leen mejor:
fuente
%
operador está en desuso. Básicamente, todas las cadenas ahora tienen un método de formato . En este caso,{0}
significa "el primer argumento paraformat()
" (el conteo comienza en 0).re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
le dará la cadena de borrado hasta el final de la línea correcta para cualquier terminal que tenga el usuario. Recuerde inicializarcurses
con algo comocurses.setupterm(fd=sys.stdout.fileno())
, y utilícelosys.stdout.isatty()
para asegurarse de que su salida no se redirija a un archivo. Consulte code.activestate.com/recipes/475116 para obtener un módulo Python completo con control de cursor y compatibilidad con colores.import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
debe imprimir los códigos hexadecimales de la secuencia de caracteres para ir al inicio de la línea.Como terminé aquí a través de Google pero estoy usando Python 3, así es como funcionaría esto en Python 3:
Respuesta relacionada aquí: ¿Cómo puedo suprimir la nueva línea después de una declaración impresa?
fuente
testing
y su segundo bucle imprime,test
la salida después de la segunda pasada seguirá siendotesting
- ahora veo que @ Nagasaki45 señaló estoprint("\r", message, end="")
La respuesta de @Mike DeSimone probablemente funcionará la mayor parte del tiempo. Pero...
Esto se debe a que
'\r'
solo vuelve al principio de la línea, pero no borra la salida.EDITAR: Mejor solución (que mi antigua propuesta a continuación)
Si el soporte POSIX es suficiente para usted, lo siguiente borraría la línea actual y dejaría el cursor al principio:
Utiliza el código de escape ANSI para borrar la línea de la terminal. Se puede encontrar más información en wikipedia y en esta gran charla .
Respuesta antigua
La solución (no tan buena) que he encontrado se ve así:
Una ventaja es que también funcionará en Windows.
fuente
Tenía la misma pregunta antes de visitar este hilo. Para mí, sys.stdout.write funcionó solo si limpio correctamente el búfer, es decir
Sin vaciar, el resultado se imprime solo al final del script
fuente
stringvar.ljust(10,' ')
en el caso de cadenas con longitud variable.Suprima la nueva línea e imprima
\r
.o escriba a stdout:
fuente
Prueba esto:
Funcionó para mí. La
end="\r"
parte hace que sobrescriba la línea anterior.¡ADVERTENCIA!
Si imprime
hi
, luego imprimehello
usando\r
, obtendráhillo
porque la salida escribió sobre las dos letras anteriores. Si imprimehi
con espacios (que no aparecen aquí), se mostraráhi
. Para solucionar este problema, imprima los espacios usando\r
.fuente
Hi BobHi BobHi BobHi BobHi Bob
. Python 3.7.1\r
está al principio en lugar del final.No pude hacer que ninguna de las soluciones en esta página funcionara para IPython , pero una ligera variación en la solución de @ Mike-Desimone hizo el trabajo: en lugar de terminar la línea con el retorno de carro, comience la línea con el retorno de carro:
Además, este enfoque no requiere la segunda declaración de impresión.
fuente
time.sleep (0.5) es para mostrar cómo se borra la salida anterior y se imprime la nueva salida "\ r" cuando está al inicio del mensaje de impresión, borrará la salida anterior antes de la nueva salida.
fuente
Esto funciona en Windows y Python 3.6
fuente
La respuesta aceptada no es perfecta . La línea que se imprimió primero permanecerá allí y si su segunda impresión no cubre toda la nueva línea, terminará con texto basura.
Para ilustrar el problema, guarde este código como un script y ejecútelo (o simplemente eche un vistazo):
La salida se verá así:
Lo que me funciona es borrar la línea antes de dejar una huella permanente. Siéntase libre de adaptarse a su problema específico:
Y ahora se imprime como se esperaba:
fuente
Aquí hay una versión más limpia, más "plug-and-play", de la respuesta de @ Nagasaki45. A diferencia de muchas otras respuestas aquí, funciona correctamente con cadenas de diferentes longitudes. Lo logra despejando la línea con tantos espacios como la longitud de la última línea impresa. También funcionará en Windows.
Uso
Simplemente utilícelo así:
Esta pequeña prueba muestra que las líneas se borran correctamente, incluso para diferentes longitudes:
fuente
Estoy un poco sorprendido de que nadie esté usando el carácter de retroceso. Aquí hay uno que lo usa.
fuente
sys.stdout.flush()
(Python3) Esto es lo que funcionó para mí. Si solo usa \ 010, dejará caracteres, así que lo modifiqué un poco para asegurarme de que sobrescriba lo que estaba allí. Esto también le permite tener algo antes del primer elemento de impresión y solo elimina la longitud del elemento.
fuente
Una respuesta más basada en las respuestas anteriores.
Contenido de pbar.py: import sys, shutil, datetime
Uso de script:
fuente
¡Aquí está mi solución! Windows 10, Python 3.7.1
No estoy seguro de por qué funciona este código, pero borra por completo la línea original. Lo compilé a partir de las respuestas anteriores. Las otras respuestas simplemente devolverían la línea al principio, pero si tuviera una línea más corta después, se vería desordenada como se
hello
convierte enbyelo
.Salida: cada línea se reescribirá sin que se muestre ningún texto antiguo:
Siguiente línea (reescrito completamente en la misma línea):
fuente
Es mejor sobrescribir toda la línea, de lo contrario, la nueva línea se mezclará con las antiguas si la nueva línea es más corta.
Tuve que usarlo
columns - 1
en Windows.fuente