2

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

谢谢。

4

1 回答 1

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))回调主线程,或者每次通过事件循环等)walkrunLater

* 这不是因为没有文件系统或操作系统可以做这样的事情,只是因为他们没有. 显然会有一些折衷——例如,如果您必须遍历整个树的更新计数,则创建和删除大量小文件会慢很多。Classic Mac 过去通过在 Finder 信息中保留缓存计数来解决这个问题……这很棒,除了这意味着调用可能需要 1us 或 1min 才能返回,而无法提前预测(或中断它)以编程方式。

于 2013-02-20T00:29:13.873 回答