容易理解的python用列表(栈)实现深度优先遍历文件

来源:互联网 发布:常州数控编程培训 编辑:程序博客网 时间:2024/06/05 13:25

上片文章介绍了广度优先,下面介绍一下深度优先。
深度的应用方向和上片文章广度差不多,大家可以看看。
深度很明显,只追求其深度,不考虑广度。

下面还是画张图形容一下:
这里写图片描述
看图分析:

对(深度遍历测试)这个文件夹,进行遍历,
1>>把(文本文档1.txt)放入列表(栈),不是文件夹,弹出
2>>把(文本文档2.txt)放入列表(栈),不是文件夹,弹出

3>>把(文件夹1)放入列表(栈),是文件夹。不弹出,
3-1>>把(文件夹1)里面的所有东西放入新列表,然后遍历新列表
,把是文件夹的放入列表(栈),
….
….
就这样下去直到把一个文件夹下的所有东西都找到,
再去打开另外一个文件夹,去同样遍历。
打开了文件夹1,就要把文件夹1里面的所有东西遍历出来。
然后再去打开文件夹2,遍历它。

下面贴上代码:

# coding:utf-8import osclass ShenDu:    def __init__(self,path):        "初始化函数,遍历的根目录"        self.path = path        self.MyList =[]#创建一个文件夹列表        self.MyList.append(self.path)#把根目录加入列表中    def BianLi(self):        "对于遍历的具体实现"        while len(self.MyList) !=0:            path =self.MyList.pop()#弹出一个路径            if os.path.isdir(path):#对弹出的路径进行判断是否为文件夹                print("文件夹",path)                myFileList =os.listdir(path)#如果是文件夹,就把文件夹中所有东西加入列表                for line in myFileList:#循环列表(过滤文件)                    myPath =path+"\\"+line#形成绝对路径                    if os.path.isdir(myPath):#如果是文件夹就把这个文件夹添加到文件夹列表中                        self.MyList.append(myPath)                    else:#如果不是则输出                        print("文件",myPath)            else:#如果不是则输出                print("文件",path)    def __del__(self):        "最终会执行的操作"        passpath =r"F:\深度遍历测试"#根目录file =ShenDu(path)#实例化对象file.BianLi()#执行方法

下面是执行结果:
这里写图片描述

简单说一下代码逻辑:
主要应用了列表模拟栈,先进后出,后进先出原则。
本案例代码:先把根目录压入列表(栈),然后弹出,判断弹出是否是文件夹,
因为根目录是文件夹,所以把里面的东西全部加入到一个新列表中,
对新列表进行遍历,把是文件夹的都压入列表(栈)。
这样依次执行下去,直到栈为空停止。