fnmatch和glob
1.普通文本匹配
大部分情況下,利用字符串匹配可以完成文件查找和過濾,畢竟python工程師還是比較熟悉字符串對象的方法
>>> import os
>>> os.listdir(".")
['a1.txt', 'b1.txt', 'd2.jpg', 'c2.jpg']
>>> [f for f in os.listdir(".") if f.endswith(".txt")]
['a1.txt', 'b1.txt']
>>> [f for f in os.listdir(".") if f.startswith(("a", "c"))]
['a1.txt', 'c2.jpg']
2.fnmatch模塊
如果需要更加靈活的字符串匹配,可以使用標準庫的fnmatch
庫,這個庫專門用來進行文件名匹配,支持使用通配符進行字符串匹配,當進行比較複雜的匹配時,這個庫很好用。
fnmatch支持的通配符如圖所示
通配符 | 含義 |
---|---|
* | 匹配任意數量的字符 |
? | 匹配單個字符 |
[seq] | 匹配seq中的字符 |
[!seq] | 匹配除了seq以外的任何字符 |
fnmatch庫只有4個函數,分別是fnmatch、fnmatchcase、filter、translate,其中最常用的就是fnmatch函數
- fnmatch: 判斷文件名是否符合特定的模式
- fnmatchcase: 同上,但是不區分大小寫
- filter: 返回第一個參數中,符合特定模式的文件名列表
- translate: 將通配符模式轉換成正則表達式(
核心
,提供一種翻譯功能)
接下來,演示fnmatch和filter函數的使用
fnmatch(name:str, pattern:str) ->bool
>>> import fnmatch
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "*.txt")]
['a1.txt', 'b1.txt']
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "[a-c]*")]
['a1.txt', 'b1.txt', 'c2.jpg']
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "[!a-c]*")]
['d2.jpg']
filter(names:list, pattern:str) ->list
>>> fnmatch.filter(os.listdir("."), "[bd]*")
['b1.txt', 'd2.jpg']
3.glob模塊
到目前爲止,我們要獲取特定類型的文件列表,都是先通過os.listdir獲取文件列表,然後使用字符串匹配或fnmatch庫進行文件名模式匹配來查找文件和過濾文件。
但是作爲一名python程序員,應該追求用最少的代碼完成同樣的需求,所以標準庫還提供了一個glob
庫=os.listdir+fnmatch(從它的導入模塊就能看出來
)
>>> import glob
>>> glob.glob("*.txt")
['a1.txt', 'b1.txt']
可以看到,Python非常靈活,有三種方法對指定目錄下的特定類型文件進行查找和過濾