Python tqdm 在指定 total 时在迭代之前退出

我一直在寻找进度条解决方案,并遇到了tqdm。在将其集成到我的程序中并按照示例进行操作后,它使用我指定的可迭代运行良好,但最初没有显示进度条。我发现我使用的可迭代器不支持。我修改了代码,以便手动指定参数,现在,运行循环会导致程序以0%的进度退出。以下是带有输出的初始代码和修改后的代码:lentotal


初始代码:


import pathlib

from tqdm import tqdm


paths = pathlib.Path('F://Music').rglob('*.mp3')


for f in tqdm(paths):

    # do stuff that takes time

    print(f.name) # prints ok

初始输出:320it [00:00, 25528.56it/s]


修改后的代码:


import pathlib

from tqdm import tqdm


paths = pathlib.Path('F://Music').rglob('*.mp3')


cnt = 0

for p in paths: cnt += 1


for f in tqdm(paths, total=cnt):

    # do stuff that takes time

    print(f.name) # line not reached

新输出:0%|                                                                                | 0/320 [00:00<?, ?it/s]


在这种情况下,指定 似乎会破坏它,即使总数是正确的。total


侃侃无极
浏览 214回答 1
1回答

慕姐4208626

定义的变量不是列表之类的数据结构,而是生成器。pathspaths = pathlib.Path('F://Music').rglob('*.mp3')当您迭代它以在变量中获取其长度时,您耗尽了生成器,并且当您尝试第二次(当您使用时)从中获取数据时,该数据不再存在。cnttqdm将生成器转换为列表的一种方法是进行实际转换,即,然后调用它。但是,如果您的变量包含大量数据,则它可能不是最佳解决方案。paths_list = list(paths)tqdmpaths这段代码应该可以正常工作:import pathlibfrom tqdm import tqdmpaths = pathlib.Path('F://Music').rglob('*.mp3')paths_list = list(paths)for f in tqdm(paths_list):&nbsp; &nbsp; print(f.name)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python