python的glob模塊通過通配符匹配文件路徑,常用符號包括、?和[]。匹配任意數量字符但不跨目錄,如.txt匹配當前目錄所有.txt文件;*搭配recursive=true可遞歸搜索;?匹配單個字符,如log_2024-01-0?.log適用于固定格式變化日志;[]限定字符集合,如[abc].txt匹配a/b/c.txt;注意默認不報錯無結果且區分大小寫環境差異。
在python中,glob模塊常用于查找符合特定規則的文件路徑名。它不像正則那樣復雜,但通配符的使用技巧足夠應對大多數日常需求。關鍵在于掌握幾個常用符號,并知道它們適用的場景。
通配符 * 的靈活用法
* 是最常用的通配符之一,代表“任意數量的字符(不包括目錄分隔符)”。比如:
- *.txt:匹配當前目錄下所有以 .txt 結尾的文件。
- data_*.csv:匹配類似 data_2023.csv、data_backup.csv 這樣的文件名。
一個容易忽略的地方是,* 不會跨目錄匹配。例如,*/*.py 可以匹配子目錄中的 .py 文件,但不會進入更深一層的子目錄。
如果你想遞歸搜索所有子目錄下的 .py 文件,可以使用 **/ 搭配 recursive=True 參數:
立即學習“Python免費學習筆記(深入)”;
import glob glob.glob('**/*.py', recursive=True)
這樣就能遍歷所有層級目錄中的 Python 文件了。
使用 ? 匹配單個字符
? 表示匹配任意一個字符。這個功能適合處理有固定格式但部分內容變化的文件名,比如日志文件:
- log_2024-01-0?.log 可以匹配 log_2024-01-01.log 到 log_2024-01-09.log。
- file_v?.txt 能匹配 file_v1.txt、file_v2.txt 等。
注意,? 只能匹配一個字符,不能多也不能少。如果你不確定位數,還是用 * 更合適。
使用 [ ] 匹配指定范圍的字符
方括號用于限定某一位置上允許出現的字符集合,比如:
- [abc].txt 可以匹配 a.txt、b.txt 和 c.txt。
- [0-9].csv 匹配以數字命名的 .csv 文件,如 1.csv、9.csv。
- [a-zA-Z]_file.txt 匹配首字母為大小寫字母的文件,如 A_file.txt 或 z_file.txt。
這在需要精確控制某些字符的情況下非常有用,尤其是批量處理時減少誤匹配。
注意事項與常見問題
- glob 返回的是字符串列表,如果路徑不存在,默認也不會報錯,只是返回空列表。
- 如果要區分大小寫,在 windows 上默認不區分,linux 上則區分。
- 如果你只需要判斷是否存在匹配項而不關心具體有哪些文件,可以用 glob.has_magic() 來判斷是否包含通配符。
glob.has_magic("*.txt") # True glob.has_magic("hello.txt") # False
基本上就這些。glob 模塊雖然簡單,但在實際腳本中很實用。只要理解好通配符的作用范圍和限制,就能避免很多路徑匹配上的坑。