需求簡單介紹:
硬碟中查詢檔案,不同目錄中檔案的整合,專案開發中多檔案聯合查詢,等都要用到檔案遍歷。
首先簡單闡述一下廣度遍歷實現方式:
廣度遍歷檔案很明顯,每一次遍歷不追求遍歷目錄的深度,只追求其廣度。
下面畫張圖形容一下
看圖分析:
對(廣度遍歷測試)這個資料夾,進行遍歷,
第一次把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...