开发者社区> 问答> 正文

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

我一直在寻找一个进度条解决方案,并遇到了tqdm。在将它集成到我的程序中并遵循示例之后,它可以使用我指定的iterable正常运行,但最初不显示进度条。我发现我使用的iterable不支持len。我修改了代码,以便手动指定total参数,现在,运行循环将导致程序以0%的进度退出。下面是初始代码和修改后的输出: 初始代码:

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

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

问题来源:stackoverflow”

展开
收起
1540413669110688 2020-03-22 18:01:14 1254 0
1 条回答
写回答
取消 提交回答
  • paths定义的变量paths = pathlib.Path('F://Music').rglob('*.mp3')不是列表等数据结构,而是generator。 当您遍历它以在变量中获取其长度时cnt,就用尽了生成器,并且当您尝试第二次从中获取数据时(使用时tqdm),该数据不再存在。 将生成器转换为列表的一种方法是进行实际转换,即paths_list = list(paths),然后对其进行调用tqdm。但是,如果您的paths变量包含大量数据,则可能不是最佳解决方案。 这段代码应该可以正常工作:

    import pathlib
    from tqdm import tqdm
    
    paths = pathlib.Path('F://Music').rglob('*.mp3')
    paths_list = list(paths)
    
    for f in tqdm(paths_list):
        print(f.name)
    

    回答来源:stackoverflow

    2020-03-22 18:11:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载