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