一般我们遍历文件夹有两种方式:深度遍历和广度遍历。
假设我们有这种一组文件夹:
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
原则:从下到上,从左到右。(本质是递归)
实例:
import os for root, dirs, files in os.walk("e:\test", topdown=False): for name in files: print(os.path.join(root, name)) for name in dirs: print(os.path.join(root, name))
执行结果:
E:>py -3 b.py
e: estACC1 #从下往上
e: estACC2
e: estADD1
e: estADD2
e: estAC
e: estAD
e: estBEE1 #再从往右
e: estBEE2
e: estBFF1
e: estBFF2
e: estBE
e: estBF
e: estA
e: estB
广度优先
广度优先的遍历顺序:A-B-C-D-E-F-C1-C2-D1-D2-E1-E2-F1-F2
原则:横向遍历,先进先出,可以用队列来实现
实例:
import os 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: est
e: estA
e: estB
e: estAC
e: estAD
e: estBE
e: estBF
e: estACC1
e: estACC2
e: estADD1
e: estADD2
e: estBEE1
e: estBEE2
e: estBFF1
e: estBFF2
解析:
>>> queue = ["e:\test"]
>>> queue.pop(0)
'e:\test'
>>> queue.pop(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop from empty list
>>> queue
[]
>>> os.listdir("e:\test")
['A', 'B']
>>>