我想知道一个文件夹中有多少文件(特别是 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 files 函数。
请您参考如下方法:
为了知道一个文件夹中有多少文件,系统必须枚举每个条目,然后它必须检查一个条目是否是一个文件。没有更快的方法,除非系统为您提供文件系统事件(例如 fsevent 或 eventfd)以在事情发生变化时通知您。
这些操作对于基于磁盘的文件系统来说很慢(几十到几百微秒),在网络驱动器上甚至更慢;您会注意到即使在普通文件浏览器中它们也非常慢。现代操作系统通过积极的缓存来处理缓慢问题,但这有其局限性(尤其是对于网络文件系统,保持缓存新鲜的开销可能超过首先执行操作的成本)。
为了加快速度,您可以缓存您已经检查过的名称的 isfile 结果,前提是它们不会转换为目录。这会为您节省很多 isfile 检查,但会牺牲一点安全性(例如,如果有人删除了一个文件并将其替换为同名文件夹)。
