容易理解的python用列表(棧)實現深度優先遍歷檔案
阿新 • • 發佈:2018-12-30
上片文章介紹了廣度優先,下面介紹一下深度優先。
深度的應用方向和上片文章廣度差不多,大家可以看看。
深度很明顯,只追求其深度,不考慮廣度。
下面還是畫張圖形容一下:
看圖分析:
對(深度遍歷測試)這個資料夾,進行遍歷,
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()#執行方法
下面是執行結果:
簡單說一下程式碼邏輯:
主要應用了列表模擬棧,先進後出,後進先出原則。
本案例程式碼:先把根目錄壓入列表(棧),然後彈出,判斷彈出是否是資料夾,
因為根目錄是資料夾,所以把裡面的東西全部加入到一個新列表中,
對新列表進行遍歷,把是資料夾的都壓入列表(棧)。
這樣依次執行下去,直到棧為空停止。