2012-11-22 8 views
10

Vorrei mostrare i progressi all'utente quando il mio script python elabora un file di grandi dimensioni.Script per mostrare i progressi?

Ho visto la stampa di script '\', "|', '/' nella stessa posizione del cursore nella shell per mostrare lo stato di avanzamento.

Come posso farlo in Python?

risposta

9

Un semplice "infinita filatrice" implementazione:

import sys 
import time 
import itertools 

for c in itertools.cycle('/-\|'): 
    sys.stdout.write('\r' + c) 
    sys.stdout.flush() 
    time.sleep(0.2) 
+0

Campione elegante molto interessante. In bicicletta attraverso i personaggi in una stringa. Hai scritto tu stesso o l'hai preso da qualche parte? Sto chiedendo perché mi piacerebbe vedere più esempi. – radj

16

Si dovrebbe usare python-progressbar

E 'semplice da usare come:

import progressbar as pb 

progress = pb.ProgressBar(widgets=_widgets, maxval = 500000).start() 
progvar = 0 

for i in range(500000): 
    # Your code here 
    progress.update(progvar + 1) 
    progvar += 1 

Questo mostrerà una barra di avanzamento come:

Progress: |####################################################   |70% 
+1

Come posso upvote più di una volta? Questo è semplicemente fantastico! – inspectorG4dget

2

Se si desidera ripristinare il proprio, è può fare qualcosa di simile:

import sys, time 

for i in range(10): 
    print ".", # <- no newline 
    sys.stdout.flush() #<- makes python print it anyway 
    time.sleep(1) 

print "done!" 

Questo stampa un punto ogni secondo e quindi stampa "fatto!"

0

O il solito elicottero (in Python 3):

import sys, time 

for i in range(10): 
    print("/-\|"[i % 4], end="\b") 
    sys.stdout.flush() #<- makes python print it anyway 
    time.sleep(0.1) 

print("\ndone!") 
0

Realizzato per divertimento. Mostra la barra girevole e il caricamento del testo. In questo modo:

|   
\ l  
- lo  
/loa  
| load  
\ loadi 
- loadin 
/loading 

Il codice è stato testato su Windows.

''' 
Spinner and a text showing loading. 
''' 
import sys 
import time 

def looper(text): 
    sys.stdout.write('\r') 
    sys.stdout.write(text) 
    sys.stdout.flush() 

spinner = ["|", "\\" , "-", "/" ] 
loading = ['l','o','a','d','i','n','g'] 

spin_1 = len(spinner) 
spin_2 = len(loading) + 1 

print("Starting program...") 

for x in range(100): 
    spin_2mod = x%spin_2 
    looper(spinner[x%spin_1] + " " + "".join(loading[0: (spin_2mod) ]) + (" " * (spin_2 - spin_2mod))) 
    time.sleep(0.5) 

print("\nExiting program...") 
time.sleep(2) 
2

tqdm è un più potente per questo caso. ha caratteristiche e comparabilità migliori.

è facile per l'utilizzo, il codice potrebbe essere semplice come:

from tqdm import tqdm 
for i in tqdm(range(10000)): 
    pass # or do something else 

personalizzazione è anche facile per special cases.

ecco un demo dal repo: