【轉】Python模組學習 - fnmatch & glob
阿新 • • 發佈:2019-01-12
【轉】Python模組學習 - fnmatch & glob
介紹
fnmatch 和 glob 模組都是用來做字串匹配檔名的標準庫。
fnmatch模組
大部分情況下使用字串匹配查詢特定的檔案就能滿足需求,如果需要更加靈活的字串匹配,就沒有辦法了,這裡介紹標準庫fnmatch。這個庫專門用來做檔名匹配
fnmatch支援的萬用字元
fnmatch支援的通配如下:
萬用字元 | 含義 |
* | 匹配任何數量的字元 |
? | 匹配單個字元 |
[seq] | 匹配seq中的字元 |
[!seq] | 匹配除seq以外的任何字元 |
fnmatch的基本使用
fnmatch這個庫相對比較簡單,只有4個函式,分別是fnmatch、fnmatchcase、filter和translate,其中最常用的是fnmatch。主要功能如下:
-
- fnmatch:判斷檔名是否符合特定的模式。
- fnmatchcase:判斷檔名是否符合特定的模式,區分大小寫。
- filter:返回輸入列表中,符合特定模式的檔名列表。
- translate:將萬用字元模式轉換成正則表示式。
例子
fnmatch和fnmatchcase用法相同,判斷名稱是否符合表示式,返回True or False
>>> os.listdir(os.curdir) ['A1.jpg', 'a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg'] >>> [ name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,'*.jpg') ] ['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg'] >>> [ name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,"[ab]*") ] ['a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg'] >>> [ name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,"[!a]*") ] ['A1.jpg', 'b3.jpg', 'b2.jpg', 'b1.jpg'] >>> [ name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,"b?.jpg") ] ['b3.jpg', 'b2.jpg', 'b1.jpg'] >>> [ name for name in os.listdir(os.curdir) if fnmatch.fnmatchcase(name,"A?.jpg") ] ['A1.jpg']
filter和fnmatch類似,只不過filter接受的第一個引數是一個檔名列表,返回符合表示式的列表(即:篩選)
>>> name = os.listdir(os.curdir) >>> name ['A1.jpg', 'a1.txt', 'a2.txt', 'aA.txt', 'b3.jpg', 'b2.jpg', 'b1.jpg'] >>> fnmatch.filter(name,'*.txt') ['a1.txt', 'a2.txt', 'aA.txt'] >>>
glob模組
我們前面的fnmatch模組,都是利用os.listdir獲取檔案列表,然後通過字串fnmatch模組進行檔名匹配的,而在Python中還有更加簡單的方式,即使用glob庫。
glob的作用就相當於os.listdir 加上 fnmatch。使用glob以後就不用使用os.listdir獲取檔案列表了。
glob比fnmatch更簡單,因為他只有 glob,iglob,escape三個函式。
glob基本使用
glob和iglob的區別在於glob返回的是一個列表,iglob返回的是一個生成器物件
>>> import glob >>> glob.glob('*.txt') ['a1.txt', 'a2.txt', 'aA.txt'] >>> g = glob.iglob('*.txt') # 使用iglob返回的是一個生成器 >>> g <generator object _iglob at 0x1050bbba0> >>> list(g) ['a1.txt', 'a2.txt', 'aA.txt'] >>>
PS:glob同樣支援萬用字元和fnmatch相同,這裡不在列舉,並且在萬用字元表示式中支援路徑
>>> glob.glob('/Users/DahlHin/github/test/*.txt') ['/Users/DahlHin/github/test/a1.txt','/Users/DahlHin/github/test/a2.txt','/Users/DahlHin/github/test/aA.txt'] >>>