2009-02-05 15 views
111

Je suis nouveau sur python et j'écris des scripts pour automatiser le téléchargement de fichiers depuis des serveurs FTP, etc. Je veux montrer la progression du téléchargement, mais je veux qu'il reste dans la même position, comme:Comment écrire une sortie au même endroit sur la console?

sortie:

Téléchargement du fichier FooFile.txt [47%]

J'essaie d'éviter quelque chose comme ceci:

 Downloading File FooFile.txt [47%] 
    Downloading File FooFile.txt [48%] 
    Downloading File FooFile.txt [49%] 

Comment dois-je procéder?


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

+1

vous pourriez être intéressé par ce module facile à utiliser, il est une barre de progression texte. http://pypi.python.org/pypi/progressbar/2.2 – wim

Répondre

188

Vous pouvez également utiliser le retour chariot:

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

Solution très commune et simple. Note: si votre ligne est plus longue que la largeur de votre terminal, cela devient moche. – ephemient

+4

J'ai aussi dû ajouter un appel à sys.stdout.flush() pour que le curseur ne rebondisse pas – scottm

+2

La beauté d'UNIX – g33kz0r

13

Imprimer le backspace \b plusieurs fois, puis remplacer l'ancien numéro avec le nouveau numéro.

+0

intéressant, je n'avais pas pensé à le faire de cette façon. –

+0

J'aime ça car il ne supprime pas les commandes précédentes (si vous avez plusieurs étapes que vous voulez laisser sur l'écran) –

+2

L'utilisation du retour chariot (par exemple 'print 'Downloading .... \ r'') ne permet pas non plus d'effacer données précédentes, mais cela évite d'avoir à savoir jusqu'où remonter. – cod3monk3y

21

Utilisation d'un terminal de traitement de la bibliothèque comme le curses module:

Le module curses fournit une interface pour la bibliothèque curses, la norme de fait pour la manutention de terminal portable de pointe.

+1

+1 pour l'introduction d'un nouveau module – pylover

+1

Non disponible pour Windows. –

+3

@Diego il y a maintenant une bibliothèque de support pour le module curses sur Windows. voir http://stackoverflow.com/a/19851287/1426237 – Plexico

9

J'aime les suivantes:

print 'Downloading File FooFile.txt [%d%%]\r'%i, 

Démo:

import time 

for i in range(100): 
    time.sleep(0.1) 
    print 'Downloading File FooFile.txt [%d%%]\r'%i, 
+5

utilisez ceci pour python 3+: print (' Téléchargement du fichier 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

Pourquoi est-ce mieux que ce qui précède (je suis un Python n00b, alors s'il vous plaît excusez mon ignorance :-))? – BalinKingOfMoria

3

Une solution propre qui a été travaillé g pour moi:

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("") 

Le sys.stdout.flush est important, sinon il devient vraiment maladroit et le print("") sur pour la sortie de la boucle est également importante.

MISE À JOUR: Comme mentionné dans les commentaires, print a également un argument flush. Donc, ce qui suit va également travailler:

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 moderne, vous pouvez fournir un argument de 'flush = True' à' print', l'appel supplémentaire 'sys.stdout.flush()' n'est donc pas nécessaire. –

2

Pour Python 3xx:

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

print ("\ r Chargement ... {}". format (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="")