进度条¶
进度条可以方便的观察程序运行的进展, 并进行时间的估算.
自己实现¶
利用 print()
可以方便的实现简单进度条.
比如利用将 'r' 传递给 print()
来刷新当前行的输出:
print(i, end='\r')
或着直接不换行, 在后面继续输出:
>>> print('#', end='')
##########
自己实现进度条比较简陋也不方便, 利用封装好的模块可以实现方便又复杂的进度条.
比较常用的进度条模块有两个:
- tqdm
- progressbar
tqdm¶
tqdm 在阿拉伯语中意思为 "进展" (taqadum) 并且是西班牙语 "我很爱你" 的缩写.(te quiero demasiado)
命令行¶
tqdm 简单易用, 仅仅需要在循环外包裹一个 tqdm
对象:
>>> from tqdm import tqdm
>>> from time import sleep
>>> for _ in tqdm(range(10), ncols=100):
>>> sleep(1)
100%|█████████████| 10/10 [00:10<00:00, 1.00s/it]
注意
windows 上最好指定 ncols
,设置进度条宽度, 否则容易出bug
tqdm 类提供了许多属性与方法控制进度条的显示: tqdm
gui¶
tqdm
还提供了 gui
版本的进度条, 但是需要 matplotlib
支持:
from tqdm import tqdm_gui
from time import sleep
for i in tqdm_gui(range(10), ncols=100):
sleep(1)
快捷方法:¶
tqdm 还提供了许多快捷方法来简单的实现进度条:
快捷方法 | 完整语法 |
trange(*args, **kwargs) | tqdm(range(args), *kwargs) |
tgrange(*args, **kwargs) | tqdm_gui(range(args), *kwargs) |
tnrange(*args, **kwargs) | tqdm_notebook(range(args), *kwargs) |
示例:
>>> from tqdm import trange
>>> from time import sleep
>>> for i in trange(10, ncols=50):
>>> sleep(1)
100%|█████████████| 10/10 [00:10<00:00, 1.00s/it]
progressbar¶
progressbar 的用法和 tqdm 类似, 也是使用一个类接受可迭代对象作为参数.
import time
from progressbar import ProgressBar
total = 1000
def dosomework():
time.sleep(0.01)
progress = ProgressBar()
for i in progress(range(100)):
dosomework()
也可以使用 update() 方法来更新进度条:
import sys, time
from progressbar import ProgressBar
total = 100
def dosomework():
time.sleep(0.01)
pbar = ProgressBar().start()
for i in range(100):
pbar.update(int((i / (total - 1)) * 100))
dosomework()
pbar.finish()
自定义插件¶
如果需要也可以自己定义进度条插件:
import time
from progressbar import *
total = 100
def dosomework():
time.sleep(0.01)
widgets = ['Progress: ',Percentage(), ' ', Bar('#'),' ', Timer(),
' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets, maxval=10*total).start()
for i in range(total):
# do something
pbar.update(10 * i + 1)
dosomework()
输出:
PS D:\znote> ######### | Elapsed Time: 0:00:01 ETA: 0:00:00 904.70 B/s
插件参数含义:
Progress
: 进度条前的文字Percentage
: 显示百分比Bar('#')
: 进度条形状ETA()
: 预计剩余时间Timer()
: 显示已用时间