給Python代碼加上酷炫進度條的幾種姿勢
點擊上方『Python 知識大全』關(guān)注并星標
第一時間接收最新Python干貨!

大家好,在下載某些文件的時候你一定會不時盯著進度條,在寫代碼的時候使用進度條可以便捷的觀察任務處理情況,除了使用print來打印之外,今天本文就介紹幾種給你的Python代碼加上酷炫的進度條的方式。

自定義ProgressBar
最原始的辦法就是不借助任何第三方工具,自己寫一個進度條函數(shù),使用time模塊配合sys模塊即可
import?sys
import?time
def?progressbar(it,?prefix="",?size=60,?file=sys.stdout):
????count?=?len(it)
????def?show(j):
????????x?=?int(size*j/count)
????????file.write("%s[%s%s]?%i/%i\r"?%?(prefix,?"#"*x,?"."*(size-x),?j,?count))
????????file.flush()????????
????show(0)
????for?i,?item?in?enumerate(it):
????????yield?item
????????show(i+1)
????file.write("\n")
????file.flush()
????
for?i?in?progressbar(range(15),?"Computing:?",?40):
????do_something()
????time.sleep(0.1)

自己定義的好處就是可以將進度條定義成我們想要的形式比如上面就是使用#與·來輸出,為什么不用print?因為sys.stdout就是print的一種默認輸出格式,而sys.stdout.write()可以不換行打印,sys.stdout.flush()可以立即刷新輸出的內(nèi)容。當然也可以封裝成類來更好的使用[1]?,但效果是類似的。
from?__future__?import?print_function
import?sys
import?re
class?ProgressBar(object):
????DEFAULT?=?'Progress:?%(bar)s?%(percent)3d%%'
????FULL?=?'%(bar)s?%(current)d/%(total)d?(%(percent)3d%%)?%(remaining)d?to?go'
????def?__init__(self,?total,?width=40,?fmt=DEFAULT,?symbol='=',
?????????????????output=sys.stderr):
????????assert?len(symbol)?==?1
????????self.total?=?total
????????self.width?=?width
????????self.symbol?=?symbol
????????self.output?=?output
????????self.fmt?=?re.sub(r'(?P%\(.+?\))d' ,
????????????r'\g%dd' ?%?len(str(total)),?fmt)
????????self.current?=?0
????def?__call__(self):
????????percent?=?self.current?/?float(self.total)
????????size?=?int(self.width?*?percent)
????????remaining?=?self.total?-?self.current
????????bar?=?'['?+?self.symbol?*?size?+?'?'?*?(self.width?-?size)?+?']'
????????args?=?{
????????????'total':?self.total,
????????????'bar':?bar,
????????????'current':?self.current,
????????????'percent':?percent?*?100,
????????????'remaining':?remaining
????????}
????????print('\r'?+?self.fmt?%?args,?file=self.output,?end='')
????def?done(self):
????????self.current?=?self.total
????????self()
????????print('',?file=self.output)
????????
from?time?import?sleep
progress?=?ProgressBar(80,?fmt=ProgressBar.FULL)
for?x?in?range(progress.total):
????progress.current?+=?1
????progress()
????sleep(0.1)
progress.done()?
tqdm
之前我們說了,自定義的好處就是可以自己修改,那么使用第三方庫的好處就是可以偷懶,不用自己寫,拿來就能用。比如提到Python進度條那肯定會想到常用的tqdm,安裝很簡單pip install tqdm即可,使用也很簡單,幾行代碼即可實現(xiàn)上面的進度條
from?tqdm?import?trange
import?time
for?i?in?trange(10):?
????time.sleep(1)
當然tqdm作為老牌的Python進度條工具,循環(huán)處理、多進程、多線程、遞歸處理等都是支持的,你可以在官方GitHub上學習[2]?、解鎖更多的玩法。
Rich
上面兩種實現(xiàn)Python進度條的方法都學會了嗎,雖然簡單但是看上去并不漂亮,顏色也比較單調(diào)。所以最后壓軸出場的就是一款比較小眾的第三方庫Rich[3]?。Rich主要是用于在終端中打印豐富多彩的文本(最高支持1670萬色)

所以當然可以使用Rich打印進度條,顯示完成百分比,剩余時間,數(shù)據(jù)傳輸速度等都可以。并且樣式更加酷炫,并且它是高度可配置的,因此我們可以對其進行自定義以顯示所需的任何信息。使用也很簡單,比如我們使用Rich來實現(xiàn)一個最簡單的進度條
from?rich.progress?import?track
import??time
for?step?in?track(range(30)):
????print('早起Python')
????time.sleep(0.5)
同時Rich支持多個進度條,這在多任務情況下監(jiān)控的進度很有用(使用方法見官方文檔)


參考資料
stackoverflow: https://stackoverflow.com/questions/3160699/python-progress-bar
[2]Tqdm: https://github.com/tqdm/tqdm
[3]Rich:?https://github.com/willmcgugan/rich
? 還想了解更多干貨?
?關(guān)注Python知識大全,查看更多精彩文章↓
覺得這篇文章還不錯?那就點亮「在看」讓更多人看到!
推薦閱讀使用 Python 一鍵下載B站視頻
Python 初學者進階的九大技能
關(guān)注「Python 知識大全」,做全棧開發(fā)工程師歲月有你 惜惜相處回復【資料】獲取高質(zhì)量學習資料
【在看】和【贊】我都需要
