Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでのUnixファイル名パターンマッチング(fnmatch)の使い方


Unixシェルのコマンドラインで使われるワイルドカードパターンは、正規表現とは異なる独自の記法です。Pythonの標準ライブラリには、このUnixスタイルのワイルドカードによるパターンマッチングを行うためのfnmatchモジュールが用意されています。

fnmatchモジュールには、主に以下の4つの関数が定義されています。

fnmatch()

この関数は、ファイル名パターン文字列の2つの引数を受け取ります。ファイル名が指定されたパターンに一致すればTrue、一致しなければFalseを返します。

次の例では、カレントディレクトリ内から「*.py」というパターンに一致するすべてのファイルを一覧表示しています。

>>> import glob,fnmatch
>>> for files in (glob.glob('*.*')):
if (fnmatch.fnmatch(files, "*.py")):
print (files)

fnmatchcase()

この関数はfnmatch()とほぼ同じ動作をしますが、決定的な違いとして、大文字と小文字を常に区別してマッチングを行います。OSやファイルシステムの挙動に依存せず、厳密な比較を行いたい場合に便利です。

以下の例では、まず「l」で始まるファイル名をfilesリストに収集し、続いてfnmatchcase()関数を適用することで、「lo」で始まる名前のファイルだけを出力しています。

>>> files=glob.glob("l*.*")
>>> files
['LICENSE.txt', 'lines.txt', 'listwidget.ui', 'lo1.ui', 'lo2.ui', 'lo3.ui', 'logo.png', 'logo.svg', 'lw.ui']
>>> for file in files:
if fnmatch.fnmatchcase(file,"lo*.*")==True:
print (file)
lo1.ui
lo2.ui
lo3.ui
logo.png
logo.svg

filter()

この関数は、ファイル名のリストの中から、指定されたパターンに一致するものだけを抽出して返します。

次のステートメントでは、カレントディレクトリ内の全ファイルのうち、「.txt」拡張子を持つファイルのリストを取得しています。

>>> fnmatch.filter(files,"*.txt")
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt', 'zen.txt', 'zen1.txt', 'zenbak.txt']

translate()

この関数は、Unixスタイルのパターンを対応する正規表現(RegEx)形式へ変換したい場合に役立ちます。translate()関数の戻り値は、reモジュールのcompile()関数でコンパイルして正規表現オブジェクトに変換し、それをパターンマッチングに利用します。

>>> pattern="*.txt"
>>> import re
>>> reg=fnmatch.translate(pattern)
>>> reg
'(?s:.*\\.txt)\\Z'
>>> rec=re.compile(reg)
>>> for file in glob.glob("*.*"):
if re.match(rec,file):
print (file)

まとめ

本記事では、fnmatchモジュールに含まれる各関数の使い方について解説しました。globモジュールと組み合わせれば、柔軟かつ直感的にファイル名の絞り込みができるため、バッチ処理やファイル整理ツールの開発などにもぜひ活用してみてください。


  1. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実

  2. Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現

    葉序パターンとは? 植物学の授業や植物の世界でよく耳にする「葉序(ようじょ)」とは、植物の茎に花・葉・種子などがどのような順序で配置されるかを表す用語です。この配置は、いわゆる「フィボナッチ螺旋」と非常によく似たパターンを示します。 フィボナッチ螺旋は、パスカルの三角形にも似た規則性を持つ数列、すなわちフィボナッチ数列に基づいています。フィボナッチ数列は次のように続きます。 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 … この数列の特徴は、各項が直前の2つの数の和になっているという点です。自然界のあらゆる場所に潜む、シンプルながら奥深い数理構造と言えま