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

2021-08-07 16:34:02 字數 1736 閱讀 4046

需求簡單介紹:

硬碟中查詢檔案,不同目錄中檔案的整合,專案開發中多檔案聯合查詢,等都要用到檔案遍歷。

首先簡單闡述一下廣度遍歷實現方式:

廣度遍歷檔案很明顯,每一次遍歷不追求遍歷目錄的深度,只追求其廣度。

下面畫張圖形容一下

看圖分析:

對(廣度遍歷測試)這個資料夾,進行遍歷,

第一次把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()#例項化乙個佇列

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#形成絕對路徑,

else:#如果不是乙個資料夾,就直接把路徑列印出來,不用對其進行遍歷了

print("檔案",path)

def __del__(self):

"最終會執行的函式"

pass

path =r"f:\廣度遍歷測試"#初始的檔案目錄

file =guangdu(path)#例項化乙個物件

file.bianli()#物件呼叫方法

執行結果如下:

**上新增了詳細注釋,下面簡單說一下邏輯:

主要利用佇列的先進先出,本案例中可以想象一下就是,先把根目錄加入佇列,然後從佇列中彈出根目錄,並判斷是否為資料夾,因為根目錄是個資料夾,所以就開啟這個目錄,把根裡面的所有東西新增到佇列中,此時佇列中就是上圖中a層級的所有檔案,然後迴圈對a層級所有東西進行判斷。a層級執行完以後,b層級加入佇列在執行,然後c執行,就這樣直到隊列為空停止。

歡迎進(q)群,幫你解決問題:

迴圈佇列這樣理解就容易多啦

初始時,front rear 0,front代表指向佇列的第乙個元素 即arr front 是佇列的第乙個元素 rear代表指向佇列的最後乙個元素的後乙個元素,當front rear時表示隊列為空,注意為空時不一定front rear 0。想象成乙個圓形好理解一點。如果把佇列填滿,這種情況下就會出現...

python 佇列詳解及python語法實現

佇列 queue 是只允許在 端進 插 操作,在另 端進 刪除操作的線性表。佇列是 種先進先出的 first in first out 的線性表,簡稱fifo。允許插 的 端為隊尾,允許刪除的 端為隊頭。佇列不允許在中間部位進 操作!假設佇列是q a1,a2,an 那麼a1就是隊頭元素,an是隊尾元...

python 最容易理解的多程序demo

建立乙個簡單的多程序任務只需要5步 1.建立任務的函式,準備多執行緒呼叫 2.建立程序池,並指定程序池中線程的個數 3.程序池呼叫步驟1建立的函式,開啟程序執行任務 4.關閉程序池 pool.close 5.判斷是否需要等待所有程序結束再執行主函式pool.join coding utf 8 fro...