本文實例講述了Python顯示進度條的方法,是Python程序設計中非常實用的技巧。分享給大家供大家參考。具體方法如下:
首先,進度條和一般的print區別在哪里呢?
答案就是print會輸出一個/n,也就是換行符,這樣光標移動到了下一行行首,接著輸出,之前已經通過stdout輸出的東西依舊保留,而且保證我們在下面看到最新的輸出結果。
進度條不然,我們必須再原地輸出才能保證他是一個進度條,否則換行了怎么還叫進度條?
最簡單的辦法就是,再輸出完畢后,把光標移動到行首,繼續在那里輸出更長的進度條即可實現,新的更長的進度條把舊的短覆蓋,就形成了動畫效果。
可以想到那個轉義符了吧,那就是/ r。
轉義符r就可以把光標移動到行首而不換行,轉義符n就把光標移動到行首并且換行。
在python中,輸出stdout(標準輸出)可以使用sys.stdout.write
例如:
Python
#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2"""Usage:Just A Template"""from __future__ import division import sys,timej = '#'if __name__ == '__main__': for i in range(1,61): j += '#' sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"/r") sys.stdout.flush() time.sleep(0.5)print
第二種思路是用轉義符/b
轉義符/b是退格鍵,也就是說把輸出的光標往回退格子,這樣就可以不用+=了,例如:
Python
#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2"""Usage:Just A Template"""from __future__ import division import sys,timeif __name__ == '__main__': for i in range(1,61): sys.stdout.write('#'+'->'+"/b/b") sys.stdout.flush() time.sleep(0.5)print光標回退2格,寫個#再回退,再寫,達到增長的目的了
不過寫這么多似乎是廢話,在耳邊常常聽到一句話:那就是不要重復造輪子。實際上python有豐富發lib幫你實現這個東西,你完全可以把心思放在邏輯開發上而不用注意這些小細節
下面要介紹的就是這個類“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安裝這個類庫,其實就一個文件,拿過來放到文件同一個目錄下面也直接可以import過來
如下圖所示:

下面就是基本使用舉例:
Python
#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2"""Usage:Just A Template"""from __future__ import division import sys,timefrom progressbar import *total = 1000 #基本用法progress = ProgressBar()for i in progress(range(total)): time.sleep(0.01) pbar = ProgressBar().start()for i in range(1,1000): pbar.update(int((i/(total-1))*100)) time.sleep(0.01)pbar.finish() #高級用法widgets = ['Progress: ', Percentage(), ' ', Bar(marker=RotatingMarker('>-=')), ' ', ETA(), ' ', FileTransferSpeed()]pbar = ProgressBar(widgets=widgets, maxval=10000000).start()for i in range(1000000): # do something pbar.update(10*i+1) time.sleep(0.0001)pbar.finish()官方示例:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py
Python
# coding:utf-8import sysimport timefrom progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, / FileTransferSpeed, FormatLabel, Percentage, / ProgressBar, ReverseBar, RotatingMarker, / SimpleProgress, Timer examples = [] def example(fn): try: name = 'Example %d' % int(fn.__name__[7:]) except: name = fn.__name__ def wrapped(): try: sys.stdout.write('Running: %s/n' % name) fn() sys.stdout.write('/n') except KeyboardInterrupt: sys.stdout.write('/nSkipping example./n/n') examples.append(wrapped) return wrapped @exampledef example0(): pbar = ProgressBar(widgets=[Percentage(), Bar()], maxval=300).start() for i in range(300): time.sleep(0.01) pbar.update(i + 1) pbar.finish() @exampledef example1(): widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()), ' ', ETA(), ' ', FileTransferSpeed()] pbar = ProgressBar(widgets=widgets, maxval=10000000).start() for i in range(1000000): # do something pbar.update(10 * i + 1) pbar.finish() @exampledef example2(): class CrazyFileTransferSpeed(FileTransferSpeed): """It's bigger between 45 and 80 percent.""" def update(self, pbar): if 45 < pbar.percentage() < 80: return 'Bigger Now ' + FileTransferSpeed.update(self, pbar) else: return FileTransferSpeed.update(self, pbar) widgets = [CrazyFileTransferSpeed(), ' <<<', Bar(), '>>> ', Percentage(), ' ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=10000000) # maybe do something pbar.start() for i in range(2000000): # do something pbar.update(5 * i + 1) pbar.finish() @exampledef example3(): widgets = [Bar('>'), ' ', ETA(), ' ', ReverseBar('<')] pbar = ProgressBar(widgets=widgets, maxval=10000000).start() for i in range(1000000): # do something pbar.update(10 * i + 1) pbar.finish() @exampledef example4(): widgets = ['Test: ', Percentage(), ' ', Bar(marker='0', left='[', right=']'), ' ', ETA(), ' ', FileTransferSpeed()] pbar = ProgressBar(widgets=widgets, maxval=500) pbar.start() for i in range(100, 500 + 1, 50): time.sleep(0.2) pbar.update(i) pbar.finish() @exampledef example5(): pbar = ProgressBar(widgets=[SimpleProgress()], maxval=17).start() for i in range(17): time.sleep(0.2) pbar.update(i + 1) pbar.finish() @exampledef example6(): pbar = ProgressBar().start() for i in range(100): time.sleep(0.01) pbar.update(i + 1) pbar.finish() @exampledef example7(): pbar = ProgressBar() # Progressbar can guess maxval automatically. for i in pbar(range(80)): time.sleep(0.01) @exampledef example8(): pbar = ProgressBar(maxval=80) # Progressbar can't guess maxval. for i in pbar((i for i in range(80))): time.sleep(0.01) @exampledef example9(): pbar = ProgressBar(widgets=['Working: ', AnimatedMarker()]) for i in pbar((i for i in range(50))): time.sleep(.08) @exampledef example10(): widgets = ['Processed: ', Counter(), ' lines (', Timer(), ')'] pbar = ProgressBar(widgets=widgets) for i in pbar((i for i in range(150))): time.sleep(0.1) @exampledef example11(): widgets = [FormatLabel('Processed: %(value)d lines (in: %(elapsed)s)')] pbar = ProgressBar(widgets=widgets) for i in pbar((i for i in range(150))): time.sleep(0.1) @exampledef example12(): widgets = ['Balloon: ', AnimatedMarker(markers='.oO<a )] pbar = ProgressBar(widgets=widgets) for i in pbar((i for i in range(24))): time.sleep(0.3) @exampledef example13(): # You may need python 3.x to see this correctly try: widgets = ['Arrows: ', AnimatedMarker(markers='←
主站蜘蛛池模板:
始兴县|
女性|
淮北市|
钦州市|
张北县|
德州市|
汤阴县|
垫江县|
逊克县|
遂昌县|
涟水县|
巴中市|
宁南县|
建始县|
玉树县|
商洛市|
彭泽县|
五峰|
博白县|
寻乌县|
蒙自县|
利川市|
石棉县|
奈曼旗|
大同县|
丹江口市|
大理市|
呼图壁县|
淮安市|
仙居县|
金坛市|
施甸县|
岚皋县|
金川县|
儋州市|
罗山县|
天台县|
会同县|
买车|
大新县|
屏东市|