for root, dirs, files in os.walk(rootDir, topdown='true'):
是python脚本中经常使用的东西。只是想知道有没有众所周知的方法来提供进展?当你有一个大的文件夹结构时,这个API可能需要一段时间?
感谢。
答案 0 :(得分:3)
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 Info中保持缓存计数来解决这个问题...这很好,除了它意味着一个可能需要1us或1min返回的调用,无法提前预测(或中断它)编程。