1. 程式人生 > >容易理解的python用佇列實現廣度優先遍歷檔案

容易理解的python用佇列實現廣度優先遍歷檔案

需求簡單介紹:
硬碟中查詢檔案,不同目錄中檔案的整合,專案開發中多檔案聯合查詢,等都要用到檔案遍歷。
首先簡單闡述一下廣度遍歷實現方式:
廣度遍歷檔案很明顯,每一次遍歷不追求遍歷目錄的深度,只追求其廣度。
下面畫張圖形容一下博主原創
看圖分析:

對(廣度遍歷測試)這個資料夾,進行遍歷,
第一次把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-8
import os
from 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): "最終會執行的函式" pass path =r"F:\廣度遍歷測試"#初始的檔案目錄 file =GuangDu(path)#例項化一個物件 file.BianLi()#物件呼叫方法

執行結果如下:
這裡寫圖片描述
程式碼上添加了詳細註釋,下面簡單說一下邏輯:
主要利用佇列的先進先出,本案例中可以想象一下就是,先把根目錄加入佇列,然後從佇列中彈出根目錄,並判斷是否為資料夾,因為根目錄是個資料夾,所以就開啟這個目錄,把根裡面的所有東西新增到佇列中,此時佇列中就是上圖中A層級的所有檔案,然後迴圈對A層級所有東西進行判斷。A層級執行完以後,B層級加入佇列在執行,然後C執行,就這樣直到佇列為空停止。