我想知道文件夹中有多少文件(特别是Windows上的共享网络文件夹,如果这会产生影响)。
我现在正在使用此代码:
include os.path
def countFiles(path):
return len([f for f in os.listdir(path)
if os.path.isfile(os.path.join(path, f))])
当文件夹中有少量文件时,它可以正常工作,但在包含许多文件的目录(例如4000)中需要很长时间。我经常运行这个(文件每隔约15秒加一次),所以减速很痛苦。
在我的特定情况下,我知道没有任何子文件夹,所以我可以跳过os.path.isfile
检查,但我想保持我的解决方案一般。坦率地说,我很惊讶os.path上没有内置的#of文件功能。
答案 0 :(得分:9)
为了知道文件夹中有多少文件,系统必须枚举每个条目,然后必须检查条目是否是文件。除非系统为您提供文件系统事件(例如fsevent
或eventfd
)以告知您事情何时发生变化,否则没有更快的方法。
这些操作对于基于磁盘的文件系统来说很慢(几十到几百微秒),在网络驱动器上甚至更慢;你会发现即使在普通的文件浏览器中它们也很慢。现代操作系统通过积极的缓存处理缓慢,但这有其局限性(特别是对于网络文件系统,其中保持缓存新鲜的开销可能超过首先执行操作的成本)。
为了加快速度,您可以在已经检查过的名称的基础上缓存isfile
结果,假设它们不会转换为目录。这样可以节省许多isfile
次检查,但会牺牲一些安全性(如果有人删除文件并将其替换为同名文件夹)。