在用Python編寫批量任務(wù)、批量下載的項目中,當(dāng)任務(wù)完成后需要輸出任務(wù)結(jié)果,比如下載的文件數(shù)、任務(wù)名稱等。一般情況下是在任務(wù)全部完成后一次性輸出結(jié)果的,在此過程中會有很長一段時間沒有信息輸出,處于靜默狀態(tài),以致于可能被認(rèn)為程序沒有正常運行,也無法得知當(dāng)前執(zhí)行到哪一步。
為了實時可視化顯示任務(wù)的運行狀態(tài),Python中可以使用文本進度條來實現(xiàn)。文本進度條跟圖形界面相比,以極低的資源消耗便可以實現(xiàn)類似的功能??捎玫奈谋具M度條有以下三個:tqdm,progressbar,alive-progress。
tqdm
GitHub項目地址:https://github.com/tqdm/tqdm
使用以下命令安裝庫:
pip install tqdm
典型示例1:
import time
from tqdm import tqdm
items = range(100)
for item in tqdm(items, ascii=True): # 轉(zhuǎn)為tqdm列表
# 執(zhí)行任務(wù)
time.sleep(0.1)
支持unicode的系統(tǒng)環(huán)境可以輸出平滑實心的進度條。Windows控制臺通常只部分支持unicode,因此通常需要顯式地指出ascii=True。這是因為unicode字符寬度被錯誤顯示,或者某些unicode字符不能渲染。
大器曾經(jīng)被這個問題困擾了大半個月,至此終于找到實質(zhì)問題所在,在tqdm中提供參數(shù)ascii=True后問題得以完美解決。
典型示例2:
import time
from tqdm import tqdm
items = range(100)
with tqdm(total=len(items), desc='任務(wù)1', ascii=True) as bar:
for item in items:
# 執(zhí)行任務(wù)
bar.update(1)
time.sleep(0.1)
這兩個示例的效果實際是差不多的,區(qū)別在于示例2中使用with語句,為tqdm提供了更多的參數(shù),如果去掉desc參數(shù),兩者輸出效果相同。desc參數(shù)可以為進度條添加前綴文字,在輸出多個進度條時非常有必要,可以很直觀地顯示進度條的所屬任務(wù)。

不指定ascii=True的效果如下圖所示:

progressbar
GitHub項目地址:https://github.com/WoLpH/python-progressbar
使用以下命令安裝庫:
pip install progressbar2
典型示例1:
import time
from progressbar import progressbar
items = range(100)
for item in progressbar(items):
# 執(zhí)行任務(wù)
time.sleep(0.1)
典型示例2:
import time
from progressbar import *
items = range(100)
widgets = ['progress1', ': ', Percentage(), ' ', Bar('#'), ' ', Timer(), ' ', ETA(), ' ', FileTransferSpeed()]
with ProgressBar(widgets=widgets, max_value=len(items)) as bar:
for item in items:
# 執(zhí)行任務(wù)
bar.update(item)
time.sleep(0.1)
widgets中的當(dāng)前數(shù)與總數(shù)之比可以用Counter(format='%(value)d/%(max_value)d')
示例2中widgets的元素可以根據(jù)自己的需要進行添加或刪減。第一個元素的progress1相當(dāng)于是進度條的前綴文字,唯一遺憾的是,前綴文字不能直接使用漢字,如需使用需要另外提供用到漢字的長度計算方法。有此需求的請移步GitHub,查看項目的使用說明。

alive-progress
GitHub項目地址:https://github.com/rsalmei/alive-progress
使用以下命令安裝庫:
pip install alive-progress
典型示例:
import time
from alive_progress import alive_bar
items = range(100)
with alive_bar(len(items)) as bar:
for item in items:
# 執(zhí)行任務(wù)
bar()
time.sleep(0.1)
alive-progress的特色是有豐富的個性化的動態(tài)特效,雖然是比較簡單的特效,但看起來非常有趣。此進度條適合喜歡折騰的人使用,詳見GitHub項目使用說明,以下圖片展示了它的部分特性。



我是大器,正在建立自己的知識庫,并將這些經(jīng)驗分享給你,請關(guān)注我,一起交流學(xué)習(xí)。