fnmatch – Unix の glob パターンに対応したファイ名比較

目的:fnmatch モジュールで Unix のファイル名比較を扱う
利用できるバージョン:1.4 以上

fnmatch モジュールは Unix シェルで使用されるような glob パターンに対応したファイル名を比較するために使用されます。

単純なマッチング

fnmatch() はあるパターンに対応したファイル名を比較して、マッチしたかどうかを表すブーリアン値を返します。オペレーティングシステムが大文字小文字を区別するファイルシステムな場合、そのマッチングは大文字小文字を区別します。

import fnmatch
import os

pattern = 'fnmatch_*.py'
print 'Pattern :', pattern
print

files = os.listdir('.')
for name in files:
    print 'Filename: %-25s %s' % (name, fnmatch.fnmatch(name, pattern))

このサンプルのパターンは ‘fnmatch_’ で始まり ‘.py’ で終わる全てのファイルにマッチします。

$ python fnmatch_fnmatch.py
Pattern : fnmatch_*.py

Filename: __init__.py               False
Filename: fnmatch_filter.py         True
Filename: fnmatch_fnmatch.py        True
Filename: fnmatch_fnmatchcase.py    True
Filename: fnmatch_translate.py      True
Filename: index.rst                 False

オペレーティングシステムやそのファイルシステムの設定に関係なく、大文字小文字の個別を強制するには fnmatchcase() を使用してください。

import fnmatch
import os

pattern = 'FNMATCH_*.PY'
print 'Pattern :', pattern
print

files = os.listdir('.')

for name in files:
    print 'Filename: %-25s %s' % (name, fnmatch.fnmatchcase(name, pattern))

私のラップトップは大文字小文字を区別するファイルシステムなので、大文字に修正したパターンにマッチするファイルはありません。

$ python fnmatch_fnmatchcase.py
Pattern : FNMATCH_*.PY

Filename: __init__.py               False
Filename: fnmatch_filter.py         False
Filename: fnmatch_fnmatch.py        False
Filename: fnmatch_fnmatchcase.py    False
Filename: fnmatch_translate.py      False
Filename: index.rst                 False

フィルタリング

ファイル名のシーケンスをテストするために filter() を使用することができます。 filter() はその pattern の引数にマッチする名前のリストを返します。

import fnmatch
import os

pattern = 'fnmatch_*.py'
print 'Pattern :', pattern

files = os.listdir('.')
print 'Files   :', files

print 'Matches :', fnmatch.filter(files, pattern)

このサンプルでは filter() は本稿で紹介しているサンプルソースファイル名のリストを返します。

$ python fnmatch_filter.py
Pattern : fnmatch_*.py
Files   : ['__init__.py', 'fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py', 'index.rst']
Matches : ['fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py']

変換パターン

内部的に fnmatch は名前とパターンを比較するために re モジュールで glob パターンから正規表現へ変換します。 translate() 関数は glob パターンから正規表現へ変換するためのパブリック API です

import fnmatch

pattern = 'fnmatch_*.py'
print 'Pattern :', pattern
print 'Regex   :', fnmatch.translate(pattern)

幾つかの文字は有効な正規表現にするためにエスケープされることに注意してください。

$ python fnmatch_translate.py
Pattern : fnmatch_*.py
Regex   : fnmatch\_.*\.py\Z(?ms)

See also

fnmatch
本モジュールの標準ライブラリドキュメント
glob
glob モジュールはパターンにマッチするファイルやディレクトリのリストを生成するために os.listdir()fnmatch を組み合わせます。
ファイルアクセス
ファイルと共に使用するその他のモジュール
Bookmark and Share