我一直在寻找一个进度条解决方案,并遇到了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”
您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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。