如何在 Python 中遞迴掃描目錄?


目錄簡單來說就是子目錄和單個檔案的集合;或者其中之一。目錄層次結構是透過將所有檔案和子目錄組織在一個主目錄(也稱為“根”目錄)中構建的。在目錄層次結構中,這些子目錄使用“/”運算子分隔。

由於目錄以層次結構/樹的形式組織,因此掃描它可以比作遍歷樹。要做到這一點,有很多方法。

  • 使用 os.walk() 方法

  • 使用 glob.glob() 方法

  • 使用 os.listdir() 方法

目錄由作業系統處理;因此,無論何時需要任何目錄的狀態更新,都需要使用 os 模組來完成。

使用 os.walk() 方法

os.walk() 函式透過自上而下或自下而上遍歷目錄樹來生成目錄樹中的檔名。它為目錄樹中以目錄頂點為根的每個目錄返回一個三元組:(路徑、名稱和檔名)

路徑是一個字串,表示目錄的路徑。names 變數包含路徑中不以 '.' 或 '..' 開頭的子目錄名稱列表。filenames 變數包含路徑中非目錄檔案的名稱列表。

示例

這裡,讓我們使用 os.walk() 方法顯示當前根目錄中存在的所有檔案和子目錄。

import os
path = "."
for root, d_names, f_names in os.walk(path):
   print(root, d_names, f_names)

輸出

讓我們編譯並執行上面的程式,以產生以下結果 -

. [] ['main.py']

示例

我們還可以為每個檔案建立一個完整路徑。為此,我們必須使用 os.path.join() 方法。此方法將為檔案建立路徑。每個檔案的這些路徑可以使用 append() 方法連線在一起,如下所示。

import os
path = "./TEST"
fname = []
for root,d_names,f_names in os.walk(path):
   for f in f_names:
      fname.append(os.path.join(root, f))
print("fname = %s" %fname)

輸出

上面程式的輸出如下所示 -

fname = []

示例

使用 os.walk() 方法,我們還可以選擇顯示我們想要列印的返回值元組的哪個元素。讓我們看下面的示例程式。

import os
for dirpath, dirs, files in os.walk("."):
   print(dirpath) # prints paths of all subdirectories present

for dirpath, dirs, files in os.walk("."):
   print(dirs) # prints the names of existing subdirectories

for dirpath, dirs, files in os.walk("."):
   print(files) # prints existing files in the current directory

輸出

上面程式的輸出如下所示 -

.
[]
['main.py']

使用 glob.glob() 方法

glob 模組用於獲取特定目錄中與特定模式匹配的檔名。glob.glob() 方法用於搜尋包含給定路徑規範作為引數的所有檔名。

如果路徑規範作為“*”(星號)傳遞,則該方法匹配檔名中的零個或多個字元;因此,它返回目錄中存在的所有檔案。

示例

讓我們嘗試使用 glob() 方法列印根目錄中存在的所有檔案和子目錄的名稱。示例如下所示。

from pathlib import Path

root_directory = Path('.')
size = 0
for f in root_directory.glob("*"):
   print(f)

輸出

main.py

結論

我們討論瞭如何使用 os.walk() 函式在 Python 中遞迴掃描目錄。

更新於: 2023-02-24

12K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.