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

PythonのglobモジュールによるUnixスタイルのパス名パターン展開


プログラムを作成していると、ファイルシステム内のファイル一覧を順番に処理したい場面が多くあります。特に、特定のパターンに一致するファイル名を探すケースは頻繁に発生します。Pythonのglobモジュールを使えば、特定のディレクトリ内のファイル、特定の拡張子を持つファイル、あるいはファイル名の一部に特定の文字列を含むファイルなどを簡単にリストアップできます。

globモジュールのパターンマッチングは、UNIXのパス展開(パス名展開)ルールに従います。ただし、このモジュールはチルダ(~)やシェル変数の展開には対応していない点に注意が必要です。

globモジュールには、主に次の3つの関数が用意されています。

glob()関数

glob()関数は、pathname引数に指定したパターンに一致するファイルのリストを返します。パス名は絶対パスでも相対パスでも構いません。また、「*」や「?」といったワイルドカードを含めることも可能です。

recursive引数のデフォルト値はFalseです。Trueを指定すると、カレントディレクトリのサブディレクトリも再帰的に検索され、パターンに一致するすべてのファイルが取得されます。

次のコードは、カレントディレクトリ内にある「.py」拡張子のファイルをすべて出力します。

>>> import glob
>>> for file in glob.glob("*.py"):
print (file)

次のコードでは、recursive=Trueを指定することで、サブディレクトリ内の「.py」ファイルも併せて出力されます。

>>> for file in glob.glob("*.py", recursive=True):
print (file)

パターンにはワイルドカード文字「?」を含めることもできます。次の例は、ファイル名が3文字で、最初の2文字が「pp」であるファイルの一覧を出力します。

>>> for file in glob.glob("pp?.py"):
print (file)

次のコードは、ファイル名が数字で終わるファイルを出力します。

>>> for file in glob.glob('*[0-9].py'):
print (file)

次の書き方では、指定したパスに一致するファイルが再帰的に出力されます。

>>> glob.glob('**/*.py', recursive=True)

カレントディレクトリ内のディレクトリ名を再帰的に表示するには、以下のようにします。

>>> glob.glob('tcl/**/', recursive=True)

iglob()関数

iglob()関数は、ファイルのリストの代わりにジェネレータオブジェクトを返します。そのため、大量のファイルを扱う場合にもメモリ効率が良くなります。next()関数を使うと、以下のように順次ファイル名を取り出して表示できます。

>>> it=glob.iglob('*.py')
>>> type(it)
<class 'generator'>
>>> while True:
try:
file=next(it)
print (file)
except StopIteration:
break

escape()関数

escape()関数は、指定した特殊文字をエスケープします。ファイル名に「[」「]」「(」「)」「#」など、パターンとして特別な意味を持つ文字が含まれる場合に非常に便利です。次の例では、chars文字列に含まれるいずれかの文字を名前に持つファイルを検索しています。

>>> chars='[]()#'
>>> for char in chars:
esc='*'+glob.escape(char)+'.py'
for file in (glob.glob(esc)):
print (file)
xyz[.py
pp[].py
pp(.py
pp#.py

  1. 【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化

    はじめに 大量のファイルやフォルダをひとつのディレクトリに放り込みっぱなしにして、「何のファイルがあったんだっけ?」と混乱しがちなPythonプログラマーは少なくありません。そんな「怠惰(=効率重視)」な開発者にとって、手作業でのファイル整理は面倒この上ないものです。 そこで本記事では、散らかったフォルダ内のファイルを拡張子ごとに適切なフォルダへ一括で振り分け、さらに不要になった空のディレクトリまで削除してくれるPythonスクリプトを紹介します。コマンドひとつでフォルダがすっきり片付くので、ぜひ活用してみてください。 具体的には、さまざまな種類のファイルが混在したディレクトリ(下図)を入力と

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

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