我一直在寻找进度条解决方案,并遇到了tqdm。在将其集成到我的程序中并按照示例进行操作后,它使用我指定的可迭代运行良好,但最初没有显示进度条。我发现我使用的可迭代器不支持。我修改了代码,以便手动指定参数,现在,运行循环会导致程序以0%的进度退出。以下是带有输出的初始代码和修改后的代码:lentotal初始代码:import pathlibfrom tqdm import tqdmpaths = 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 pathlibfrom tqdm import tqdmpaths = pathlib.Path('F://Music').rglob('*.mp3')cnt = 0for p in paths: cnt += 1for 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
1 回答

慕姐4208626
TA贡献1852条经验 获得超7个赞
定义的变量不是列表之类的数据结构,而是生成器。pathspaths = pathlib.Path('F://Music').rglob('*.mp3')
当您迭代它以在变量中获取其长度时,您耗尽了生成器,并且当您尝试第二次(当您使用时)从中获取数据时,该数据不再存在。cnttqdm
将生成器转换为列表的一种方法是进行实际转换,即,然后调用它。但是,如果您的变量包含大量数据,则它可能不是最佳解决方案。paths_list = list(paths)tqdmpaths
这段代码应该可以正常工作:
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)
添加回答
举报
0/150
提交
取消