一般我们遍历文件夹有两种方式:深度遍历和广度遍历。

假设我们有这种一组文件夹:

               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:\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

原则:横向遍历,先进先出,可以用队列来实现

实例:

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:\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 "<stdin>", line 1, in <module>
IndexError: pop from empty list
>>> queue
[]
>>> os.listdir("e:\\test")
['A', 'B']
>>>

posted on 2019-10-14 15:05  腿短毛不多  阅读(650)  评论(0)    收藏  举报