嵌套的tqdm输出到新行

10
当我尝试在嵌套循环中使用tqdm时,循环更新到新的行。进度条对于单个循环运行良好。我正在运行Python 3.6.5版本。这是否与Python版本兼容性有关?如果tqdm当前无法实现此操作,那么我该如何使用其他模块来完成这个任务?我已经尝试使用progressbar模块,但它出现了相同的问题。
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)

这是我得到的输出结果:

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]

我原本期望这个程序只会产生两个进度条的输出。


你的解决方案是什么? - Mr Squid
2个回答

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()

我在 Jupyter Notebook 上测试了我的代码,并且它能够正常运行。
希望对你有帮助!
附注: 为了控制各种内部循环。
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()

实际上,您可能不需要手动控制外部循环,只需为任何内部tqdm迭代器执行手动操作即可。 - Kurisu Makise

1

由于Windows终端不允许使用ANSI转义字符序列,因此必须安装另一个模块才能使嵌套的tqdm在Windows上正常工作。对我来说,安装colorama解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接