Python如何得到資料夾下的所有檔案

你可以至少有3種方法來列出給定資料夾下的所有檔案,使用的函式分別為os.listdiros.walkglob.glob

下面列出的是本教程程式碼的一些預設條件,

  1. Python版本-Python 3
  2. 給定資料夾的名字為dirPath,並且它存在在系統中,所以程式碼中我們就不必檢查資料夾是否存在。

os.listdir

os.listdir列出了給定資料夾下的所有檔案和資料夾,所以我們需要新增額外的程式碼來只把檔案給提取出來。

import os
dirPath = r"C:\git\DelftStack\content"
result = [f for f in os.listdir(dirPath) if os.path.isfile(os.path.join(dirPath, f))]
print(result)

os.listdir只返回相對給定資料夾dirPath的相對路徑,但是函式os.path.isfile需要的是完整資料夾路徑來檢查輸入是不是檔案,所以我們需要用函式os.path.join來把 dirPathos.listdir的結果組合起來,組成檔案或資料夾的完整路徑。

os.walk

os.walk可以按照深度優先的順序遍歷整個資料夾,並且當它遍歷到一個新的(子)資料夾時候會產生一個3個元素的元組-(dirpath, dirname, filenames),這其中也包括最高階別的給定資料夾本身。

給定資料夾下的所有檔案都會在os.walk()發生器的第一次遍歷中產生,所以得到所有檔案的最Pythonic的方式就是,

import os
dirPath = r"C:\git\DelftStack\content"
result = next(os.walk(dirPath))[2]
print(result)
提示
例子中輸出的結果只是檔名本身,假如需要完整路徑的話,需要結合dirpath來組成完整的資訊。

glob.glob

glob模組是按照給定的檔案的模式來去匹配資料夾中的內容,模式遵循的是Unix shell中的規則。

glob.glob返回結果是匹配給定模式的帶完整路徑的檔名。我們需要查詢的是所有檔案,它們符合的命名模式是*.*,這裡萬用字元*匹配的是任意長度的字串。

import glob
dirPathPattern = r"C:\git\DelftStack\content\*.*"
result = glog.glob(dirPathPattern)
print(result)

glob.glob返回的是匹配檔案的完整路徑,比如C:\git\DelftStack\content\about.md.

警告

上面例子中glob.glob方法不能保證列出來的所有結果都是檔案,因為它只是檢查路徑名符不符合給定的模式,但它不檢查它到底是一個資料夾還是一個資料夾。比如,假如一個資料夾的名字是test.test,它也符合*.*模式,那這個資料夾也會在結果中出現。 假如你需要確保輸出結果只包含檔案的話,需要用os.path.isfile函式來驗證。