2012-11-22 13 views
10

Chciałbym pokazać postęp użytkownika, gdy mój skrypt Pythona przetwarza duży plik.Skrypt, aby pokazać postęp?

Widziałem wydruki skryptowe '\', "|', '/' w tej samej pozycji kursora w powłoce, aby pokazać postęp.

Jak mogę to zrobić w pythonie?

Odpowiedz

9

Prosty "nieskończony spinner" realizacja:

import sys 
import time 
import itertools 

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

Bardzo interesująca elegancka próbka. Przechodzenie przez znaki w ciągu znaków. Napisałeś to sam czy skądś to wziąłeś? Pytam, ponieważ chciałbym zobaczyć więcej przykładów. – radj

16

Należy użyć python-progressbar

Jest tak prosty w obsłudze jak:

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 

To pokaże się pasek postępu jak:

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

Jak upvote więcej niż raz? To jest niesamowite! – inspectorG4dget

2

Jeśli chcesz toczyć własne, może zrobić coś takiego:

import sys, time 

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

print "done!" 

Spowoduje to wydrukowanie jednej kropki na sekundę, a następnie wydrukowanie "gotowe!"

0

Albo zwykły helikopter (w Pythonie 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

Wykonane to dla zabawy. Pokazuje pasek przewijania i ładowanie tekstu. W ten sposób:

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

Kod został przetestowany w systemie 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 jest mocniejszy dla tej sprawy. ma lepsze cechy i porównywalność.

jest łatwa do zastosowania, kod może być proste, jak:

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

personalizacja jest również łatwy do special cases.

o to demo z repo:

Powiązane problemy