1. 程式人生 > >【轉】Python模組學習 - fnmatch & glob

【轉】Python模組學習 - fnmatch & glob

【轉】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']
>>>