tqdm任务进度条模块使用心得

文章介绍了如何使用Python的tqdm模块创建和管理进度条,包括基础安装、基础使用、手动更新、自定义格式以及解决与print函数冲突的方法。通过tqdm.write函数来实现输出内容时不干扰进度条显示,还展示了如何封装tqdm.write以兼容print功能。
摘要由CSDN通过智能技术生成

安装

使用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仅支持字符串输出且仅支持单个参数

暂时只用到这些,以后有机会拓展使用再更新

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值