Python 如何得到資料夾下的所有檔案
你可以至少有 3 種方法來列出給定資料夾下的所有檔案,使用的函式分別為 os.listdir
、os.walk
、glob.glob
。
下面列出的是本教程程式碼的一些預設條件,
- Python 版本-Python 3
- 給定資料夾的名字為
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
來把 dirPath
和 os.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
函式來驗證。
相關文章 - Python File
- Python 如何查詢具有特定副檔名的檔案
- 如何在 Python 中從檔案讀取特定行
- 在 Python 中讀取文字檔案並列印其內容
- 在 Python 中逐行讀取 CSV
- 在 Python 中實現 touch 檔案