【概述】
说起,如何快速地遍历文件夹。或许,某人立刻就想到了线程池,几个worker并行处理遍历任务,总比一个worker的速度更快吧。当然,很多人不以为然。这要看单机性能是否够强悍,使你能够起更多的worker,以加快速度。我们,先来看看Python遍历文件夹的几种方案:
- 分析MFT,获取目录结构(仅适合NTFS格式);
- 使用os.walk或os.path.walk遍历;
- 使用os.listdir递归遍历;
- 创建一个shell process交互,使用ls(windows 下dir.exe)遍历;
- 线程池并行处理遍历,工作线程使用os.listdir。
至于第一种方案,需要读取卷中的$MFT文件,并分析里面的文件记录项,代表作为everything.exe,此处略过。
【walk遍历】
这是最简单施工的一种目录遍历,Python已经把的性能做的很好,应付结构复杂度小的目录,显得性能最佳。
def IterateFiles(directory):
assert os.path.isdir(directory),'make sure directory argument should be a directory'
result = []
for root,dirs,files in os.walk(directory, topdown=True):
for fl in files:
result.append(os.path.join(root,fl))
return result
有一个缺陷,如果子文件夹过深,将导致如下错误:
names = listdir(top) TypeError: must be (buffer overflow), not st
此时,将参数directory的值使用Unicode对象即可,如:
directory = u”D:\\”
另外,walk函数参数topdown设置为True时,将自顶向下遍历。经检验,这样的遍历速度最优。
【递归遍历】
递归遍历,我最讨厌的一种方案。理论上,它是相当的费时间,同时在这里,还不能使用迭代器,造成内存空间大部分的占用,实不适宜用来应对大文件夹。