有没有办法从 os.walk 提供进度?
在Python脚本中,for root, dirs, files in os.walk(rootDir, topdown='true'):
这段代码是经常用到的。有人在想,是否有什么好的方法可以显示进度呢?因为当你处理一个很大的文件夹结构时,这个API可能会花费一些时间。
谢谢。
1 个回答
这个walk
本身不能告诉你进度,因为你无法提前知道某个目录下有多少个文件。
不过,在大多数使用walk
的程序中,你实际上是在对文件进行某种操作,而这个操作通常会比隐含的stat
调用花费更长的时间。举个例子,我的第一个程序里用到了os.walk
,执行list(os.walk(path))
花了2.301秒,而我的实际功能(尽管只处理了这些文件中的一小部分)却花了139.104秒。我觉得这种情况是很常见的。
所以,你可以先读取整个目录树(比如使用list(os.walk(path))
),然后利用这些信息来生成你实际工作的进度。
在一个实际的程序中,你可能想在执行list(os.walk(path))
时显示一个“未知进度条”,并标注“正在确定大小...”,等到完成后再换成一个显示百分比的进度条,比如“0/12345个文件”。(实际上,我现在想到了这个主意,准备在我的程序里加上这个未知进度条…)
(对于一个单线程的交互式程序,你显然不想在list(os.walk(path))
上卡住;你可以在后台线程中执行它,并通过回调将结果传回主线程,或者每次在事件循环中执行一次walk
对象,然后用runLater
处理其余部分等等。)
* 这并不是因为没有文件系统或操作系统能够做到这一点,而是因为它们通常不这样做。显然,这样做会有一些权衡——例如,如果你需要遍历整个目录树来更新文件数量,那么创建和删除很多小文件的速度会变得很慢。经典的Mac系统曾通过在Finder信息中保持一个缓存计数来解决这个问题……这很好,但也意味着一个调用的返回时间可能是1微秒或1分钟,事先无法预测(或者以编程方式中断它)。