Python製作進度條
阿新 • • 發佈:2022-12-01
目錄
本部落格主要參考為北京大學陳斌老師的下一站Python
本部落格主要參考為北京大學陳斌老師的下一站Python
tqdm進度條
什麼時候需要進度條?
- 長時間的迴圈,讓等待變得更加友好;
- 統計執行時間和每次迭代平均時間;
- 給人印象深刻的動態輸出畫面。
tqdm基本概念
- 包裹並替代原有的可迭代物件,自動顯示進度條;
- 可以設定自定義資訊;
- 也可以自行控制進度條進展。
基礎用法
# 準備測試資料 from time import sleep from faker import Faker f = Faker("en-us") alist = [f.name() for _ in range(50)] # 匯入tqdm模組 from tqdm import tqdm, trange
用tqdm包裹range即可
p = 1
for i in tqdm(range(50)):
p *= (i + 1)
sleep(0.05)
print(f"{p=:,}")
或者可以用trange()
達到相同的效果
p = 1
for i in trange(50):
p *= (i + 1)
sleep(0.05)
print(f"{p=:,}")
對於其它可迭代物件,直接用tqdm包裹起來
s = "" for name in tqdm(alist): s += f"{name=} " # 假裝處理一下 sleep(0.05) print(s)
設定進度條資訊
# 處理中的資訊
proc_bar = tqdm(range(50))
p = 1
for i in proc_bar:
proc_bar.set_description(f"正在計算{i=:02d}") # 設定前導資訊
p *= (i + 1)
sleep(0.05)
print(f"{p=:,}")
或者把資訊放在進度條後面
# 顯示資訊 proc_bar = tqdm(alist) s = "" for name in proc_bar: proc_bar.set_postfix({"正在處理":f"{name}"}) # 加在後面 s += f"{name=} " # 假裝處理一下 sleep(0.05) print(s)
自定義控制
有時候我們不是直接用for迴圈迭代一個物件,例如使用opencv從視訊中抽幀做處理。
# 自定義進度條
proc_bar = tqdm(total=100) # 進度條物件
p = 1
n = 40
for i in range(n):
#proc_bar.set_description(f"正在計算{i=:02d}")
proc_bar.update(100/n) # 更新進度條顯示
p *= (i + 1)
sleep(0.05)
proc_bar.close() # 關閉進度條,釋放資源
print(f"{p=:,}")
例子:
cap = cv2.VideoCapture(path)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
with tqdm(total=total_frames) as pbar:
pbar.set_description("Extracting all frames")
while cap.isOpened():
ret, frame = cap.read()
pass # process(frame)
cv2.imshow(frame, "frame")
pbar.update(1)
if cv2.waitKey(1)&0xFF == ord('q'):
break
圖形化進度條
from tqdm.tk import tqdm
# from tqdm.gui import tqdm
# from tqdm.rich import tqdm
s = ""
for name in tqdm(alist):
s += f"{name=} " # 假裝處理一下
sleep(0.05)
print(s)