glob – ファイル名のパターンマッチング

目的:ファイル名のパターンマッチングに適した Unix シェルのルールを使用する
利用できるバージョン:1.4

glob API はとてもシンプルですが、このモジュールは大きなチカラを秘めています。glob はあるパターンにマッチする名前でファイルシステム上のファイルリストを探すプログラムのどんな状況においても役に立ちます。もし特定の拡張子、接尾辞、又は中間に共通の文字列を持った全ファイル名のリストが必要なら、自分でディレクトリのコンテンツを精査するコードを書く代わりに glob を使用してください。

glob のパターンルールは正規表現ではありません。その代わり、標準 Unix パス拡張ルールに準拠します。数個だけ特殊な文字があり、2種類の異なるワイルドカード、文字範囲がサポートされます。そのパターンルールはファイル名の部分に対して適用されます(パス区切り文字 / で停止します)。そのパターンのパスは絶対パスか相対パスです。シェル変数名やチルダ(~)は展開されません。

サンプルデータ

次のテストファイルがカレントのワークディレクトリに存在すると仮定してください。

$ python glob_maketestdata.py
dir
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/subdir
dir/subdir/subfile.txt

Note

サンプルコードを実行したいなら、これらのファイルを作成するために glob_maketestdata.py を実行してください。

ワイルドカード

アスタリスク(*)は名前の一部にあるゼロ個以上の文字にマッチします。例えば dir/* です。

import glob
for name in glob.glob('dir/*'):
    print name

そのパターンは dir ディレクトリ内の全てのパス名(ファイル又はディレクトリ)にマッチします。そして、サブディレクトリは再帰的にマッチしません。

$ python glob_asterisk.py
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/subdir

サブディレクトリにあるファイルを表示するためには、そのパターンにサブディレクトリを含めなければなりません。

import glob

print 'Named explicitly:'
for name in glob.glob('dir/subdir/*'):
    print '\t', name

print 'Named with wildcard:'
for name in glob.glob('dir/*/*'):
    print '\t', name

1番目のケースは明確なサブディレクトリの名前で表示します。一方、2番目のケースはそのディレクトリを探すためにワイルドカードに依存します。

$ python glob_subdir.py
Named explicitly:
        dir/subdir/subfile.txt
Named with wildcard:
        dir/subdir/subfile.txt

このサンプルの結果はどちらも同じです。もし別のサブディレクトリがあったら、ワイルドカードが両方のサブディレクトリにマッチしてそれらのファイルを表示したでしょう。

1文字のワイルドカード

サポートされている他のワイルドカード文字としてはてなマーク(?)があります。それは名前の指定した位置に存在するどんな1文字にもマッチします。例えば、

import glob

for name in glob.glob('dir/file?.txt'):
    print name

“file” で始まって、何か1文字があり、”.txt” で終わる全てのファイル名にマッチします。

$ python glob_question.py
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt

文字範囲

特定の文字をマッチさせる必要があるとき、はてなマークの代わりに文字範囲を使用してください。例えば、拡張子の前に数字を持つ名前の全ファイルを見つけるために使用します。

import glob
for name in glob.glob('dir/*[0-9].*'):
    print name

文字範囲 [0-9] は1つの数字にマッチします。その範囲はそれぞれの文字/数字のコード表の順番に基づき、そのダッシュ記号は連続した文字の範囲であることを表します。この文字範囲は [0123456789] と書くこともできます。

$ python glob_charrange.py
dir/file1.txt
dir/file2.txt

See also

glob
本モジュールの標準ライブラリドキュメント
パターンマッチング覚え書き
Open Group のシェルコマンド言語仕様の glob の説明
fnmatch
ファイル名マッチングの実装
ファイルアクセス
ファイルと共に使用するその他のモジュール
Bookmark and Share