安装
使用pip模块进行下载即可
pip install tqdm
基础使用
调用模块
from tqdm import tqdm
bar = tqdm(total=100)
参数total定义任务总数量,也可直接传入数组等格式,会根据对应长度定义总数量,如下
from tqdm import tqdm
s = [1,2,3,4,5,6,7]
bar = tqdm(s)
0%| | 0/7 [00:00<?, ?it/s]
配合for循环
for i in tqdm.tqdm(range(10)):
time.sleep(1)
30%|███ | 3/10 [00:03<00:07, 1.01s/it]
此时会根据循环进度进行任务进度条的更新
手动更新进度条
q = tqdm.tqdm(total=10)
time.sleep(1)
q.update(1)
time.sleep(1)
q.update(2)
tqdm.update(n),在目前进度上增加n个进度
0%| | 0/10 [00:00<?, ?it/s]
10%|█ | 1/10 [00:01<00:09, 1.01s/it]
30%|███ | 3/10 [00:02<00:04, 1.57it/s]
自定义进度条格式
默认参数下,格式如下
10%|█ | 1/10 [00:01<00:09, 1.01s/it]
需要自定义内容时,在初始化参数中加入bar_format参数。源码说明如下:
bar_format : str, optional
Specify a custom bar string formatting. May impact performance.
[default: '{l_bar}{bar}{r_bar}'], where
l_bar='{desc}: {percentage:3.0f}%|' and
r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, '
'{rate_fmt}{postfix}]'
Possible vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt,
percentage, elapsed, elapsed_s, ncols, nrows, desc, unit,
rate, rate_fmt, rate_noinv, rate_noinv_fmt,
rate_inv, rate_inv_fmt, postfix, unit_divisor,
remaining, remaining_s, eta.
bar_format参数支持str格式输入。
只需添加部分打印时,可以在默认格式'{l_bar}{bar}{r_bar}'
基础上进行编辑,如'start {l_bar} mid {bar} mid {r_bar} end'
,实现如下补充打印
start 30%| mid ███ mid | 3/10 [00:02<00:04, 1.57it/s] end
源码中描述了对应默认l_bar及r_bar的实际格式,可以根据需求调用 Possible vars中的相应默认参数进行编辑补充
输出与print冲突处理
启用tqdm进度栏后,若是过程中需要print输出文本信息时,会出现进度栏出现换行,且此前进度栏并不会被清除,打印信息混乱。
for i in tqdm.tqdm(range(10)):
print(i)
time.sleep(1)
0%| | 0/10 [00:00<?, ?it/s]0
1
20%|██ | 2/10 [00:02<00:08, 1.01s/it]2
30%|███ | 3/10 [00:03<00:07, 1.01s/it]3
4
50%|█████ | 5/10 [00:05<00:05, 1.01s/it]5
6
70%|███████ | 7/10 [00:07<00:03, 1.01s/it]7
8
90%|█████████ | 9/10 [00:09<00:01, 1.01s/it]9
100%|██████████| 10/10 [00:10<00:00, 1.01s/it]
tqdm输出方式
默认下tqdm会在sys.stderr进行输出,可以通过file=*
参数进行指定。
而print是对sys.stdout进行输出,故而均会在屏幕上进行输出,导致混乱
tqdm.write解决
tqdm模块中已经提供一定解决方案,调用tqdm.write(str)可用进行字符串的输出。使用该方法进行输出时,会临时清除此前的进度栏输出,在进行str内容的打印
for i in tqdm.tqdm(range(5),file=sys.stdout):
tqdm.tqdm.write(str(i))
time.sleep(1)
0
1
2
3
4
100%|██████████| 5/5 [00:05<00:00, 1.01s/it]
此时需注意tqdm.write()默认会向sys.stdout进行输出,但tqdm模块默认输出sys.stderr输出,故而使用tqdm.write()时无法清除sys.stderr上的进度栏信息的。所以需要通过file=sys.stdout
将tqdm模块的输出指定为sys.stdout。也可用根据需要重定向write函数的输出。
封装tqdm.write函数
可将sys.stdout的write函数重写tqdm.write,使得用户可用正常使用print函数
class DummyFile:
def __init__(self, file):
if file is None:
file = sys.stderr
self.file = file
def write(self, x):
if len(x.rstrip()) > 0:
tqdm.write(x, file=self.file)
@contextlib.contextmanager
def redirect_stdout(file=None):
if file is None:
file = sys.stderr
old_stdout = file
sys.stdout = DummyFile(file)
yield
sys.stdout = old_stdout
for batch in tqdm(range(5), total=100, position=0, desc="desc",file=sys.stdout):
time.sleep(0.2)
with redirect_stdout(sys.stdout):
print(batch)
此段转载自该链接: link
0
1
2
3
4
desc: 5%|▌ | 5/100 [00:01<00:20, 4.73it/s]
当然粗暴一点可以直接print = tqdm.write
,但需要注意tqdm.wirte仅支持字符串输出且仅支持单个参数
暂时只用到这些,以后有机会拓展使用再更新