Python 的標準函式「glob」可以使用名稱與路徑的方式,查找出匹配條件的檔案或資料夾,查找出檔案後,搭配其他函式庫 ( 例如 os 標準函式庫 ) ,就能做到像是批次重新命名、批次刪除...等的動作。
原文參考:查找匹配檔案 glob
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
下方列出 glob 模組常用的兩個方法 ( 參考 Python 官方文件:glob ):
方法 | 參數 | 說明 |
---|---|---|
glob() | pathname | 以串列方式,回傳所有匹配的檔案或資料夾名稱。 |
iglob() | pathname | 以 generator 方式,回傳所有匹配的檔案或資料夾名稱。 |
要使用 glob 必須先 import glob 模組,或使用 from 的方式,單獨 import 特定的類型。
import glob
from glob import glob
glob(pathname) 執行後會根據 pathname 查找符合的檔案或資料夾,下方的例子執行後,會以「相對路徑」的方式尋找同一層的 test 資料夾裡所有的檔案 ( pathname 也可以使用「絕對路徑」進行查找 )。
import glob
a = glob.glob(r'./test/*')
print(a)
pathname 支援下方萬用字元 ( 通配符 ) 的寫法:
字元 | 說明 | 範例 |
---|---|---|
* | 匹配任意數量字元。 | 「wh*」會找到 what、white 和 why,但找不到 awhile 或 watch。 |
? | 匹配單一字元。 | 「b?ll」會找到 ball、bell 和 bill。 |
[] | 匹配方括號中的字元。 | 「b[ae]ll」會找到 ball 和 bell,但找不到 bill。 |
- | 匹配一個範圍內的字元。 | 「b[a-c]d」將找到 bad、bbd 和 bcd。 |
import glob
print(glob.glob(r'./test/*')) # 找出所有檔案
print(glob.glob(r'./test/*.txt')) # 找出所有副檔名為 .txt 的檔案,例如 1.txt、hello.txt
print(glob.glob(r'./test/[0-9].txt')) # 找出所以名稱為一個數字,副檔名為 .txt 的檔案,例如 1.txt、2.txt
print(glob.glob(r'./test/????.*')) # 找出所有檔名有四個字元的檔案,例如 test.txt、demo.py
print(glob.glob(r'./test/t*.*')) # 找出所有 t 開頭的檔案,例如 test.txt、test.py
print(glob.glob(r'./test/*e*.*')) # 找出所有檔名裡有 e 的檔案,例如 test.txt、hello.py
glob 也可額外設定 recursive=True 參數 ( 預設 False ),設定後可使用「**」的方式,搜尋資料夾內所有資料夾的內容,例如下方的程式執行後,會搜尋所有資料夾裡,檔名有四個字元的所有檔案。
import glob
a = glob.glob('./**/????.*', recursive=True)
print(a) # ['./test.png', './main.py', './test/test.py']
iglob(pathname) 的使用方式和 glob() 相同,差別在於得到的結果為 generator,必須使用 next() 之類的方式才能取用 ( 參考:產生器 generator )。
import glob
a = glob.glob('./**/????.*', recursive=True)
b = glob.iglob('./**/????.*', recursive=True)
print(a) # ['./test.png', './main.py', './test/test.py']
print(b) # <generator object _iglob at 0x1085449d0>
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^