如
文档中所述,这是因为您需要提供进度指示器。根据您对文件的操作,您可以使用文件计数或文件大小。
其他答案建议将
os.walk()
生成器转换为列表,以便获得
__len__
属性。然而,这将根据您拥有的文件总数消耗大量内存。
另一种可能性是进行
预计算:首先遍历整个文件树并计算文件总数(但不保留文件列表,只保留计数!),然后您可以再次遍历并提供预先计算的文件计数给
tqdm
。
def walkdir(folder):
"""Walk through every files in a directory"""
for dirpath, dirs, files in os.walk(folder):
for filename in files:
yield os.path.abspath(os.path.join(dirpath, filename))
filescount = 0
for _ in tqdm(walkdir(target_dir)):
filescount += 1
for filepath in tqdm(walkdir(target_dir), total=filescount):
sleep(0.01)
请注意,我在
os.walkdir
上定义了一个包装函数:由于您正在处理的是文件而不是目录,因此最好定义一个函数,该函数将进展到文件而不是目录。
但是,如果不使用
walkdir
包装器,您也可以获得相同的结果,但是需要在遍历每个子文件夹后恢复上一个进度条状态,这会更加复杂。
filescount = 0
for dirPath, subdirList, fileList in tqdm(os.walk(target_dir)):
filescount += len(filesList)
last_state = 0
for dirPath, subdirList, fileList in os.walk(target_dir):
sleep(0.01)
dirName = dirPath.split(os.path.sep)[-1]
for fname in tqdm(fileList, total=filescount, initial=last_state):
last_state += len(fileList)