容易理解的python用队列实现广度优先遍历文件

来源:互联网 发布:表格公式查找相同数据 编辑:程序博客网 时间:2024/06/09 16:22

需求简单介绍:
硬盘中查询文件,不同目录中文件的整合,项目开发中多文件联合查找,等都要用到文件遍历。
首先简单阐述一下广度遍历实现方式:
广度遍历文件很明显,每一次遍历不追求遍历目录的深度,只追求其广度。
下面画张图形容一下博主原创
看图分析:

对(广度遍历测试)这个文件夹,进行遍历,
第一次把A中的东西遍历完,[文件夹1,文件1.txt,文件2.txt,文件3.txt]
第二次把B遍历完,[文件夹2,文件4.txt,文件5.txt]
第三次把C中东西遍历完[文件6.txt]。

也就是每次对同级目录进行遍历,不管其他的层级。
[文件夹1,文件1.txt,文件2.txt,文件3.txt] 在同级A中
[文件夹2,文件4.txt,文件5.txt]在同级B中
[文件6.txt]在同级C中

# coding:utf-8import osfrom collections import deque#从收集模块中导入双端队列class GuangDu:    def __init__(self,path):        "初始换函数,读取的根目录"        self.path =path         self.MyList =deque([])#实例化一个队列        self.MyList.append(self.path)#把根目录路径放入队列中    def  BianLi(self):        "广度遍历的方法实现"        while len(self.MyList) !=0:#当队列中为空的时候跳出循环            path =self.MyList.popleft()#从队列中弹出一个路径            if os.path.isdir(path):#对弹出的path路径判断是否是一个文件夹                print("文件夹",path)#打印文件夹的路径                myFilePath =os.listdir(path)#如果是一个文件夹,就把文件夹里面的所有东西添加进列表中,                for line in myFilePath:#对添加到列表中的东西进行遍历                    myPath =path +"\\"+line#形成绝对路径,                    self.MyList.append(myPath)#把遍历的东西都加入到队列中            else:#如果不是一个文件夹,就直接把路径打印出来,不用对其进行遍历了                print("文件",path)    def __del__(self):        "最终会执行的函数"        passpath =r"F:\广度遍历测试"#初始的文件目录file =GuangDu(path)#实例化一个对象file.BianLi()#对象调用方法

运行结果如下:
这里写图片描述
代码上添加了详细注释,下面简单说一下逻辑:
主要利用队列的先进先出,本案例中可以想象一下就是,先把根目录加入队列,然后从队列中弹出根目录,并判断是否为文件夹,因为根目录是个文件夹,所以就打开这个目录,把根里面的所有东西添加到队列中,此时队列中就是上图中A层级的所有文件,然后循环对A层级所有东西进行判断。A层级执行完以后,B层级加入队列在执行,然后C执行,就这样直到队列为空停止。