1. 程式人生 > >容易理解的python用列表(棧)實現深度優先遍歷檔案

容易理解的python用列表(棧)實現深度優先遍歷檔案

上片文章介紹了廣度優先,下面介紹一下深度優先。
深度的應用方向和上片文章廣度差不多,大家可以看看。
深度很明顯,只追求其深度,不考慮廣度。

下面還是畫張圖形容一下:
這裡寫圖片描述
看圖分析:

對(深度遍歷測試)這個資料夾,進行遍歷,
1>>把(文字文件1.txt)放入列表(棧),不是資料夾,彈出
2>>把(文字文件2.txt)放入列表(棧),不是資料夾,彈出

3>>把(資料夾1)放入列表(棧),是資料夾。不彈出,
3-1>>把(資料夾1)裡面的所有東西放入新列表,然後遍歷新列表
,把是資料夾的放入列表(棧),
….
….
就這樣下去直到把一個資料夾下的所有東西都找到,
再去開啟另外一個資料夾,去同樣遍歷。
打開了資料夾1,就要把資料夾1裡面的所有東西遍歷出來。
然後再去開啟資料夾2,遍歷它。

下面貼上程式碼:

# coding:utf-8
import os
class 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): "最終會執行的操作" pass path =r"F:\深度遍歷測試"#根目錄 file =ShenDu(path)#例項化物件 file.BianLi()#執行方法

下面是執行結果:
這裡寫圖片描述

簡單說一下程式碼邏輯:
主要應用了列表模擬棧,先進後出,後進先出原則。
本案例程式碼:先把根目錄壓入列表(棧),然後彈出,判斷彈出是否是資料夾,
因為根目錄是資料夾,所以把裡面的東西全部加入到一個新列表中,
對新列表進行遍歷,把是資料夾的都壓入列表(棧)。
這樣依次執行下去,直到棧為空停止。