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

Jinku Hu 2023年1月30日 2018年7月18日
  1. os.listdir
  2. os.walk
  3. glob.glob
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.rst.

警告

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

假如你需要確保輸出結果只包含檔案的話,需要用 os.path.isfile 函式來驗證。

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - Python File

相關文章 - Python Dictionary