print - python sin salto de linea
¿Cómo puedo imprimir sobre la línea actual en una aplicación de línea de comando? (9)
En Unix, puedo usar / r (retorno de carro) o / b (retroceso) para imprimir sobre el texto ya visible en el depósito (es decir, sobrescribir la línea actual de nuevo).
¿Puedo lograr el mismo efecto en una línea de comando de Windows desde un script de Python?
Probé el módulo de curses, pero no parece estar disponible en Windows.
Manera simple si solo quieres actualizar la línea anterior:
import time
for i in range(20):
print str(i) + ''/r'',
time.sleep(1)
En Windows (python 3), parece funcionar (sin usar stdout directamente):
import sys
for i in reversed(range(0,20)):
time.sleep(0.1)
if(i == 19):
print(str(i), end='''', file=sys.stdout)
else:
print("/r{0:{width}".format(str(i), width = w, fill = '' '', align = ''right''), end='''', file=sys.stdout)
sys.stdout.flush()
w = len(str(i))
La misma línea se actualiza cada vez que se llama a la función de impresión.
Este algoritmo se puede mejorar, pero se publica para mostrar lo que puede hacer. Puede modificar el método de acuerdo a sus necesidades.
sí:
import sys
import time
def restart_line():
sys.stdout.write(''/r'')
sys.stdout.flush()
sys.stdout.write(''some data'')
sys.stdout.flush()
time.sleep(2) # wait 2 seconds...
restart_line()
sys.stdout.write(''other different data'')
sys.stdout.flush()
Sé que esto es viejo, pero quería contar mi versión (funciona en mi PC en el cmd, pero no en el inactivo) para anular una línea en Python 3:
>>> from time import sleep
>>> for i in range(400):
>>> print("/r" + str(i), end="")
>>> sleep(0.5)
EDITAR: funciona en Windows y en Ubuntu
acabo de tener este problema. Todavía puede usar /r
, incluso en el símbolo del sistema de Windows, sin embargo, solo lo lleva al salto de línea anterior ( /n
).
Si haces algo como esto:
cnt = 0
print str(cnt)
while True:
cnt += 1
print "/r" + str(cnt)
Obtendrás:
0
1
2
3
4
5
...
Eso es porque solo regresa a la última línea. Como ya escribió un carácter de línea nueva con la última instrucción de impresión, el cursor va desde el comienzo de una nueva línea vacía hasta el comienzo de la misma nueva línea vacía.
Para ilustrar, después de imprimir el primer 0, el cursor estaría aquí:
0
| # <-- Cursor
Cuando estás, vas al comienzo de la línea. Pero ya estás en el comienzo de la línea.
La solución es evitar la impresión de un carácter /n
, por lo que el cursor está en la misma línea y sobrescribe el texto correctamente. Puedes hacer eso con print ''text'',
La coma impide la impresión de un carácter de nueva línea.
cnt = 0
print str(cnt),
while True:
cnt += 1
print "/r" + str(cnt),
Ahora reescribirá las líneas correctamente.
Tenga en cuenta que esto es Python 2.7, de ahí las instrucciones de print
.
método fácil :)
import sys
from time import sleep
import os
#print("/033[y coordinate;[x coordinateH Hello")
os.system(''cls'')
sleep(0.2)
print("/033[1;1H[]")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H []")
sleep(0.2)
print("/033[1;1H[]")
sleep(0.2)
import sys
import time
for i in range(10):
print ''/r'', # print is Ok, and comma is needed.
time.sleep(0.3)
print i,
sys.stdout.flush() # flush is needed.
Y si está en el IPython-notebook, simplemente así:
import time
from IPython.display import clear_output
for i in range(10):
time.sleep(0.25)
print(i)
clear_output(wait=True)
Gracias por todas las respuestas útiles aquí chicos. Necesitaba esto :)
Encontré particularmente útil la respuesta de nosklo, pero quería algo completamente contenido dentro de una función pasando el resultado deseado como parámetro. Además, realmente no necesitaba el temporizador, ya que quería que la impresión tuviera lugar después de un evento específico).
Esto es lo que hizo el truco para mí, espero que alguien más lo encuentre útil:
import sys
def replace_cmd_line(output):
"""Replace the last command line output with the given output."""
sys.stdout.write(output)
sys.stdout.flush()
sys.stdout.write(''/r'')
sys.stdout.flush()
La forma más fácil es usar dos / r - uno al principio y uno al final
for i in range(10000):
print(''/r''+str(round(i*100/10000))+''% Complete/r''),
Irá bastante rápido