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)