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?

¿Fue útil?

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="")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top