¿Cómo se escribe la salida en el mismo lugar en la consola?
-
21-08-2019 - |
Pregunta
Soy nuevo en Python y escribo algunas secuencias de comandos para automatizar la descarga de archivos desde servidores FTP, etc. Quiero mostrar el progreso de la descarga, pero quiero que se quede en la misma posición, como por ejemplo:
salida:
descarga de archivos FooFile.txt [47%]
Estoy tratando de evitar algo como esto:
Downloading File FooFile.txt [47%]
Downloading File FooFile.txt [48%]
Downloading File FooFile.txt [49%]
¿Cómo debo ir haciendo esto?
Duplicar : ¿Cómo puedo imprimir sobre la línea actual en una aplicación de línea de comandos?
Solución
También puede utilizar el retorno de carro:
sys.stdout.write("Download progress: %d%% \r" % (progress) )
sys.stdout.flush()
Otros consejos
Utilice una biblioteca de terminales de manipulación como el maldice módulo :
El módulo maldiciones proporciona una interfaz para la biblioteca maldiciones, el estándar de facto para la manipulación avanzada terminal portátil.
Python 2
Me gusta lo siguiente:
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Demostración:
import time
for i in range(100):
time.sleep(0.1)
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Python 3
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Demostración:
import time
for i in range(100):
time.sleep(0.1)
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Imprimir el carácter de retroceso \b
varias veces, y luego sobrescribir el número viejo con el nuevo número.
#kinda like the one above but better :P
from __future__ import print_function
from time import sleep
for i in range(101):
str1="Downloading File FooFile.txt [{}%]".format(i)
back="\b"*len(str1)
print(str1, end="")
sleep(0.1)
print(back, end="")
En Python 3xx:
import time
for i in range(10):
time.sleep(0.2)
print ("\r Loading... {}".format(i)+str(i), end="")
Una buena solución que ha estado trabajando para mí es:
from __future__ import print_function
import sys
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r')
sys.stdout.flush()
print("")
El sys.stdout.flush
es importante de lo contrario se pone muy torpe y el print("")
en bucle de salida también es importante.
Actualizar : Como se ha mencionado en los comentarios, print
también tiene un argumento flush
. Por lo que el siguiente también funcionará:
from __future__ import print_function
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r', flush=True)
print("")
x="A Sting {}"
for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")
for j in range(0,len(y)):
print("\b",end="")