无论如何从os.walk提供进展?

时间:2013-02-19 22:07:07

标签: python

for root, dirs, files in os.walk(rootDir, topdown='true'):是python脚本中经常使用的东西。只是想知道有没有众所周知的方法来提供进展?当你有一个大的文件夹结构时,这个API可能需要一段时间?

感谢。

1 个答案:

答案 0 :(得分:3)

walk本身无法为您提供进展,因为无法事先知道某些目录树下有多少条目。*

但是,在大多数使用walk的程序中,您实际上使用文件执行某些操作,这通常需要比隐式stat调用更长的时间。例如,抓住我的第一个程序os.walklist(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 Info中保持缓存计数来解决这个问题...这很好,除了它意味着一个可能需要1us或1min返回的调用,无法提前预测(或中断它)编程。