186 votes

Python pour imprimer la barre d'état et le pourcentage

Pour implémenter une barre d'état comme ci-dessous:

 [==========                ]  45%
[================          ]  60%
[==========================] 100%
 

Je veux que cela soit imprimé sur la sortie standard, et continue de l'actualiser, pas d'imprimer sur une autre ligne. Comment faire ça? Merci.

276voto

Mark Rushakoff Points 97350

Le caractère '\r' (retour à la ligne) réinitialise le curseur au début de la ligne et vous permet d'écrire sur ce qui était précédemment sur la ligne.

 from time import sleep
import sys

for i in range(21):
    sys.stdout.write('\r')
    # the exact output you're looking for:
    sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
    sys.stdout.flush()
    sleep(0.25)
 

Je ne suis pas sûr à 100% de savoir si cela est complètement portable sur tous les systèmes, mais cela fonctionne au moins pour Linux et OSX.

164voto

icktoofay Points 60218

Il existe un module Python que vous pouvez obtenir avec PyPI appelé progressbar qui implémente une telle fonctionnalité. Si cela ne vous dérange pas d'ajouter une dépendance, c'est une bonne solution. Sinon, allez avec l'une des autres réponses.

Un exemple simple d'utilisation

 import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
for i in xrange(20):
    bar.update(i+1)
    sleep(0.1)
bar.finish()
 

Pour l'installer, vous pouvez utiliser easy_install progressbar , ou pip install progressbar si vous préférez pip.

24voto

Matthew Flaschen Points 131723

Vous pouvez utiliser \r ( retour de chariot ). Démo:

 import sys
total = 10000000
point = total / 100
increment = total / 20
for i in xrange(total):
    if(i % (5 * point) == 0):
        sys.stdout.write("\r[" + "=" * (i / increment) +  " " * ((total - i)/ increment) + "]" +  str(i / point) + "%")
        sys.stdout.flush()
 

23voto

Jacob Tsui Points 111

Ici, vous pouvez utiliser le code suivant comme fonction:

 def drawProgressBar(percent, barLen = 20):
    sys.stdout.write("\r")
    progress = ""
    for i in range(barLen):
        if i < int(barLen * percent):
            progress += "="
        else:
            progress += " "
    sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
    sys.stdout.flush()
 

7voto

Brian Khuu Points 171

Sur la base des réponses ci-dessus et d'autres questions similaires sur la barre de progression de l'interface de ligne de commande, je pense avoir obtenu une réponse commune à toutes. Vérifiez-le à http://stackoverflow.com/a/15860757/2254146

Voici une copie de la fonction, mais modifiée pour correspondre à votre style:

 import time, sys

# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
    barLength = 20 # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength*progress))
    text = "\rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status)
    sys.stdout.write(text)
    sys.stdout.flush()
 

Ressemble à

Pourcentage: [====================] 99.0%

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X