नीचे दिया गया कोड काफी सामान्य समाधान है और इसमें एक समय बीतने और समय शेष अनुमान भी है। आप इसके साथ किसी भी चलने का उपयोग कर सकते हैं। प्रगति बार में 25 अक्षरों का एक निश्चित आकार होता है, लेकिन यह पूर्ण, आधे और तिमाही ब्लॉक वर्णों का उपयोग करके 1% चरणों में अपडेट दिखा सकता है। आउटपुट इस तरह दिखता है:
18% |████▌ | \ [0:00:01, 0:00:06]
उदाहरण के साथ कोड:
import sys, time
from numpy import linspace
def ProgressBar(iterObj):
def SecToStr(sec):
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
return u'%d:%02d:%02d'%(h, m, s)
L = len(iterObj)
steps = {int(x):y for x,y in zip(linspace(0, L, min(100,L), endpoint=False),
linspace(0, 100, min(100,L), endpoint=False))}
qSteps = ['', u'\u258E', u'\u258C', u'\u258A'] # quarter and half block chars
startT = time.time()
timeStr = ' [0:00:00, -:--:--]'
activity = [' -',' \\',' |',' /']
for nn,item in enumerate(iterObj):
if nn in steps:
done = u'\u2588'*int(steps[nn]/4.0)+qSteps[int(steps[nn]%4)]
todo = ' '*(25-len(done))
barStr = u'%4d%% |%s%s|'%(steps[nn], done, todo)
if nn>0:
endT = time.time()
timeStr = ' [%s, %s]'%(SecToStr(endT-startT),
SecToStr((endT-startT)*(L/float(nn)-1)))
sys.stdout.write('\r'+barStr+activity[nn%4]+timeStr); sys.stdout.flush()
yield item
barStr = u'%4d%% |%s|'%(100, u'\u2588'*25)
timeStr = ' [%s, 0:00:00]\n'%(SecToStr(time.time()-startT))
sys.stdout.write('\r'+barStr+timeStr); sys.stdout.flush()
# Example
s = ''
for c in ProgressBar(list('Disassemble and reassemble this string')):
time.sleep(0.2)
s += c
print(s)
सुधार या अन्य टिप्पणियों के सुझावों की सराहना की जाती है। चीयर्स!