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)
tqdm.gui.tqdm
会调用matplotlib,会消耗一定资源:
tqdm.tk.tqdm
的