一般我们遍历文件夹有两种方式:深度遍历和广度遍历。
假设我们有这种一组文件夹:
A B
C D E F
C1 C2 D1 D2 E1 E2 F1 F2
深度优先
深度优先的遍历顺序:A-C-C1-C2-D-D1-D2-B-E-E1-E2-F-F1-F2
返回顺序:C1-C2-D1-D2-C-D-E1-E2-F1-F2-E-F-A-B
原则:从下到上,从左到右。(本质是递归)
实例:
importosfor root, dirs, files in os.walk("e:\\test", topdown=False):for name infiles:print(os.path.join(root, name))for name indirs:print(os.path.join(root, name))
执行结果:
E:\>py -3 b.py
e:\test\A\C\C1 #从下往上
e:\test\A\C\C2
e:\test\A\D\D1
e:\test\A\D\D2
e:\test\A\C
e:\test\A\D
e:\test\B\E\E1 #再从往右
e:\test\B\E\E2
e:\test\B\F\F1
e:\test\B\F\F2
e:\test\B\E
e:\test\B\F
e:\test\A
e:\test\B
广度优先
广度优先的遍历顺序:A-B-C-D-E-F-C1-C2-D1-D2-E1-E2-F1-F2
原则:横向遍历,先进先出,可以用队列来实现
实例:
importos
queue= ["e:\\test"] #将队列定义为要遍历的文件夹
while queue!=[]: #当队列不为空时执行下面的操作
path = queue.pop(0) #定义路径是从头取出的节点
print(path)if os.path.isdir(path): #判断是否是目录
for i in os.listdir(path): #在该路径下给栈添加一个节点
queue.append(path+'\\'+i)
执行结果:
E:\>py -3 b.py
e:\test
e:\test\A
e:\test\B
e:\test\A\C
e:\test\A\D
e:\test\B\E
e:\test\B\F
e:\test\A\C\C1
e:\test\A\C\C2
e:\test\A\D\D1
e:\test\A\D\D2
e:\test\B\E\E1
e:\test\B\E\E2
e:\test\B\F\F1
e:\test\B\F\F2
解析:
>>> queue = ["e:\\test"]
>>> queue.pop(0)
'e:\\test'
>>> queue.pop(0)
Traceback (most recent call last):
File "", line 1, in
IndexError: pop from empty list
>>> queue
[]
>>> os.listdir("e:\\test")
['A', 'B']
>>>