2009-02-05 7 views
111

Soy nuevo en python y estoy escribiendo algunos scripts para automatizar la descarga de archivos desde servidores FTP, etc. Quiero mostrar el progreso de la descarga, pero quiero que permanezca en la misma posición, como:¿Cómo escribo la salida en el mismo lugar en la consola?

salida:

FooFile.txt descarga de archivos [47%]

que 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 hacer esto?


Duplicar: How can I print over the current line in a command line application?

+1

que podría estar interesado en este módulo fácil de usar, que es una barra de progreso de texto. http://pypi.python.org/pypi/progressbar/2.2 – wim

Respuesta

188

También puede utilizar el retorno de carro:

sys.stdout.write("Download progress: %d%% \r" % (progress)) 
sys.stdout.flush() 
+11

Solución muy común y simple. Nota: si su línea es más larga que el ancho de su terminal, esto se pone feo. – ephemient

+4

También tuve que agregar una llamada a sys.stdout.flush() para que el cursor no rebotara alrededor de – scottm

+2

La belleza de UNIX – g33kz0r

13

impresión del carácter de retroceso \b varias veces, y luego sobrescribir el número viejo con el nuevo número.

+0

interesante, no había pensado en hacerlo de esa manera. –

+0

Me gusta porque no borra los comandos anteriores (si tiene varias etapas que desea dejar en la pantalla) –

+2

El uso del retorno de carro (por ejemplo, 'imprimir' Descargando .... \ r'') tampoco se borra datos anteriores, pero evita tener que saber cuánto tiempo retrocederá. – cod3monk3y

21

uso de una biblioteca de terminales de manipulación de como el curses module:

El módulo maldiciones proporciona una interfaz para la biblioteca maldiciones, el estándar de facto para la manipulación avanzada terminal portátil.

+1

+1 para introducir un nuevo módulo – pylover

+1

No disponible para Windows. –

+3

@Diego ahora hay una biblioteca de soporte para el módulo curses en Windows. ver http://stackoverflow.com/a/19851287/1426237 – Plexico

9

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, 
+5

use esto para python 3+: print (' Descarga de archivo FooFile.txt [% d %%] \ r '% i , end = "") – loolooyyyy

7
#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="") 
+0

¿Por qué es esto mejor que el anterior (soy un Python n00b, así que disculpe mi ignorancia :-))? – BalinKingOfMoria

3

Una buena solución que tiene estado trabajando g 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.

ACTUALIZACIÓN: Como se menciona 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("") 
+1

En Python moderno, puede suministrar un argumento de 'flush = True' a' print', por lo que no es necesario realizar la llamada 'sys.stdout.flush()' adicional. –

2

Para Python 3xx:

import time 
for i in range(10): 
    time.sleep(0.2) 
    print ("\r Loading... ".format(i)+str(i), end="") 
+0

print ("Cargando ... {}". formato (i), end = "") – omasoud

0
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="") 
Cuestiones relacionadas