May*_*tam 6 python progress python-2.7 tqdm
我正在使用 for 循环遍历目录树中的大型组文件。
这样做时,我想通过控制台中的进度条监视进度。因此,我决定为此使用 tqdm。
目前,我的代码如下所示:
for dirPath, subdirList, fileList in tqdm(os.walk(target_dir)):
sleep(0.01)
dirName = dirPath.split(os.path.sep)[-1]
for fname in fileList:
*****
Run Code Online (Sandbox Code Playgroud)
输出:
Scanning Directory....
43it [00:23, 11.24 it/s]
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是它没有显示进度条。我想知道如何正确使用它并更好地了解它的工作原理。另外,如果有任何其他可以在此处使用的 tqdm 替代方案。
这是一种更简洁的方法,可以预先计算文件数量,然后在文件上提供状态栏:
file_count = sum(len(files) for _, _, files in os.walk(folder)) # Get the number of files
with tqdm(total=file_count) as pbar: # Do tqdm this way
for root, dirs, files in os.walk(folder): # Walk the directory
for name in files:
pbar.update(1) # Increment the progress bar
# Process the file in the walk
Run Code Online (Sandbox Code Playgroud)
除非您知道“完成”的含义,否则您无法显示完成百分比。
在os.walk运行时,它不知道最终要迭代多少个文件和文件夹: 的返回类型os.walk没有__len__. 它必须一直向下查看目录树,枚举所有文件和文件夹,以便对其进行计数。换句话说,os.walk必须将所有工作都做两次才能告诉您它将生产多少项,这是低效的。
如果您在显示进度条是死心塌地,你可以后台数据到内存中的列表:list(os.walk(target_dir))。我不推荐这个。如果您正在遍历大型目录树,这可能会消耗大量内存。更糟糕的是,如果followlinks是,True并且您有一个循环目录结构(子项链接到他们的父项),那么它可能会永远循环下去,直到用完 RAM。
这是因为tqdm不知道结果os.walk会持续多久,因为它是一个生成器,所以len不能调用它。您可以通过os.walk(target_dir)先转换为列表来解决此问题:
for dirPath, subdirList, fileList in tqdm(list(os.walk(target_dir))):
Run Code Online (Sandbox Code Playgroud)
从模块的文档来看tdqm:
如果可能的话,使用 len(iterable) 。作为最后的手段,仅显示基本进度统计信息(无预计到达时间,无进度条)。
但是,len(os.walk(target_dir))这是不可能的,因此没有预计到达时间或进度条。
正如本杰明指出的,使用list确实会使用一些内存,但不会太多。在我的 Windows 10 计算机上,大约 190,000 个文件的假脱机目录导致 Python 使用此代码约 65MB 内存。
| 归档时间: |
|
| 查看次数: |
16586 次 |
| 最近记录: |