Python 是否仍要从os.walk提供进度?

Python 是否仍要从os.walk提供进度?,python,Python,对于os.walk(rootDir,top-down='true')中的root、dirs和文件:是python脚本中经常使用的东西。只是想知道有没有什么众所周知的方法可以在这里取得进展?当你有一个大的文件夹结构时,这个API会花费一些时间吗 谢谢。walk本身不能给你进步,因为无法预先知道某个目录树下有多少条目* 然而,在大多数使用walk的程序中,您实际上是在处理文件,这通常比隐式stat调用花费的时间要长得多。例如,抓取包含os.walk的第一个程序时,list(os.walk(path)

对于os.walk(rootDir,top-down='true')中的root、dirs和文件:
是python脚本中经常使用的东西。只是想知道有没有什么众所周知的方法可以在这里取得进展?当你有一个大的文件夹结构时,这个API会花费一些时间吗


谢谢。

walk本身不能给你进步,因为无法预先知道某个目录树下有多少条目*

然而,在大多数使用
walk
的程序中,您实际上是在处理文件,这通常比隐式
stat
调用花费的时间要长得多。例如,抓取包含
os.walk
的第一个程序时,
list(os.walk(path))
需要2.301秒,而我的实际功能(尽管只对其中一小部分文件进行操作)需要139.104秒。我认为这种事情很典型

因此,您可以首先读取整个漫游过程(例如,通过使用
列表(os.walk(path))
),然后使用该信息生成实际工作的进度

在现实的程序中,您可能希望在执行
列表(os.walk(path))
时显示一个带有“确定大小…”标签的“不确定进度条”,然后在完成后将其替换为带有“0/12345文件”的百分比进度条。(事实上,现在我已经想到了这个想法,我要将这个不确定的进度条添加到我的程序中…)

(对于单线程交互式程序,您显然不希望只阻塞
列表(os.walk(path))
;您可以在后台线程中通过回调主线程来执行此操作,或者每次通过事件循环对
walk
对象和
runLater
对象执行一次迭代,其余的则执行一次,等等。)


*这并不是因为没有任何文件系统或操作系统能够做这样的事情,只是因为它们不能。显然会有一些折衷办法,例如,如果你必须遍历整个树的更新计数,那么创建和删除大量小文件的速度会慢得多。经典Mac过去通过在Finder信息中保留缓存计数来解决这个问题……这很好,只是它意味着一个可能需要1us或1min才能返回的呼叫,而无法通过编程方式预先预测(或中断)哪个呼叫。

即使可以,您会显示什么?在完成之前,您不知道总数。@Mark Ransom我认为python可能有一些API可以轻松地告诉您数字,然后您只需记录进度。不幸的是,没有用于获取文件计数的操作系统级API,因此获取计数的方法是计算返回的文件名。当您需要递归到子目录时,这会加倍,因为在获得文件列表之前您不知道这些子目录。@Mark ransem-wow!看起来很奇怪。我会把这个打开一段时间,以防有人想到什么。@dublintech操作系统以树状结构跟踪文件。它只知道如何通过连续询问路径(本质上是文件夹)中的每个节点下一个节点来访问文件,直到它到达最终目标。没有任何东西可以在一个集中的位置跟踪所有文件(或者,如果有,它将是特定于某个文件系统的,并且不可概括,因此不可能有一个API可以从python跨文件系统工作)。因此,了解所有文件的唯一方法是遍历或“漫游”树。