查找和過濾文件: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非常靈活,有三種方法對指定目錄下的特定類型文件進行查找和過濾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章