嵌套 tqdm 输出到新行

Rea*_*ggs 5 python progress-bar

当我尝试将 tqdm 用于嵌套循环时,循环会更新为新行。进度条在一个循环中运行良好。我正在运行 python 3.6.5。这是python版本兼容性的问题吗?如果这在 tqdm 中目前是不可能的,我将如何使用另一个模块来做到这一点?

我试过使用进度条模块,但它有同样的问题。

from tqdm import tqdm
from time import sleep
for i in tqdm(range(20), desc = 'sleeping'):
     for j in tqdm(range(15), desc = 'inside', leave = False):
        sleep(.1)
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

sleeping:   0%|                                                                                 | 0/20 [00:00<?, ?it/s]
inside:   0%|                                                                                   | 0/15 [00:00<?, ?it/s]
inside:   7%|?????                                                                      | 1/15 [00:00<00:01,  9.94it/s]
inside:  13%|??????????                                                                 | 2/15 [00:00<00:01,  9.94it/s]
inside:  20%|???????????????                                                            | 3/15 [00:00<00:01,  9.91it/s]
inside:  27%|????????????????????                                                       | 4/15 [00:00<00:01,  9.88it/s]
inside:  33%|?????????????????????????                                                  | 5/15 [00:00<00:01,  9.86it/s]
inside:  40%|??????????????????????????????                                             | 6/15 [00:00<00:00,  9.84it/s]
inside:  47%|???????????????????????????????????                                        | 7/15 [00:00<00:00,  9.86it/s]
inside:  53%|????????????????????????????????????????                                   | 8/15 [00:00<00:00,  9.87it/s]
inside:  60%|?????????????????????????????????????????????                              | 9/15 [00:00<00:00,  9.88it/s]
inside:  67%|??????????????????????????????????????????????????                        | 10/15 [00:01<00:00,  9.88it/s]
inside:  73%|???????????????????????????????????????????????????????                   | 11/15 [00:01<00:00,  9.87it/s]
inside:  80%|????????????????????????????????????????????????????????????              | 12/15 [00:01<00:00,  9.86it/s]
inside:  87%|?????????????????????????????????????????????????????????????????         | 13/15 [00:01<00:00,  9.85it/s]
inside:  93%|?????????????????????????????????????????????????????????????????????     | 14/15 [00:01<00:00,  9.86it/s]
inside: 100%|??????????????????????????????????????????????????????????????????????????| 15/15 [00:01<00:00,  9.84it/s]
sleeping:   5%|????                                                                     | 1/20 [00:01<00:28,  1.52s/it]
Run Code Online (Sandbox Code Playgroud)

我预计这只会产生 2 个输出进度条。

Kur*_*ise 5

关键是内部循环,tqdm(你的迭代器)也返回一个迭代器。您可以将其视为迭代器和进程栏的组合。

因此,当它耗尽时,下一个循环将创建一个新的 tqdm 迭代器,从而创建新行。

我的解决方案是不要使用 tqdm 作为迭代器,而只是将其用作进程栏。

outter_bar = tqdm(range(20), desc = 'sleeping')
outter_loop = range(20)

inner_bar = tqdm(range(15), desc = 'inside', leave = False)
inner_loop = range(15)

for i in outter_loop:
    outter_bar.update(1)
    for j in inner_loop:
        inner_bar.update(1)
        sleep(0.5)
    inner_bar.reset()
Run Code Online (Sandbox Code Playgroud)

我在 jupyter 笔记本上测试了我的代码并且它有效。

希望有帮助!

PS:控制各种内循环

outter_loop = tqdm(range(2))
inner = [range(10), range(15)]
inner_bar = tqdm(None, total=10)

for i in outter_loop:
    inner_bar.total = len(inner[i])
    for _ in inner[i]:
        sleep(0.5)
        inner_bar.update(1)
    inner_bar.reset()
Run Code Online (Sandbox Code Playgroud)