条件に一致するファイルやディレクトリの一覧を取得する(pathlibモジュール)
Python の pathlib モジュールで用意されている Path.glob メソッドを使って、指定した条件に一致するファイルやディレクトリの一覧を取得する方法について解説します。
※ glob モジュールを使って条件に一致するファイルやディレクトリの一覧を取得するには「条件に一致するファイルやディレクトリの一覧を取得する」を参照されてください。
(Last modified: )
条件に一致するファイルやディレクトリを取得する
指定した条件に一致するファイルやディレクトリの一覧を取得するには pathlib モジュールで用意されている Path.glob メソッドを使用します。
Path.glob(pattern)
パスが示すディレクトリおよびそのサブディレクトリに含まれるファイルやディレクトリの中で、 1 番目の引数に指定したパターンとマッチするファイルやディレクトリへ順番にアクセスできるイテレータを取得します。この時、パターンには次の特殊な文字を指定することができます。
* 0文字以上の任意の文字 ? 1文字の任意の文字 [abc] 括弧の中のいずれかの文字
それぞれ使い方を見ていきます。
*:0文字以上の任意の文字
* は 0 文字以上の任意の文字とマッチします。例えばパスとして *.txt と指定した場合は a.txt や memo.txt など 0 文字以上の任意の文字列+'.txt' と一致するファイルやディレクトリの一覧を取得できます。
下記は末尾が .txt で終わるファイルおよびディレクトリの一覧を取得します。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
下記は b から始まるファイルおよびディレクトリの一覧を取得します。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('b*'):
print(name)
>> ./test\back
>> ./test\book.png
>> ./test\book.txt
?:1文字の任意の文字
? は 1 文字以上の任意の文字とマッチします。例えばパスとして ?.txt と指定した場合は a.txt や b.txt など 1 文字以上の任意の文字列+'.txt' と一致するファイルやディレクトリの一覧を取得できます。 1 文字ではない abc.txt などにはマッチしません。
下記は 3 文字の任意の文字で始まり .txt で終わるファイルおよびディレクトリの一覧を取得します。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('???.txt'):
print(name)
>> ./test\cup.txt
>> ./test\pen.txt
[abc]:括弧の中のいずれかの文字
[] は括弧の中に記述した文字のいずれか 1 文字とマッチします。例えばパスとして 199[789].txt と指定した場合は 1997.txt や 1998.txt や 1999.txt と一致するファイルやディレクトリの一覧を取得できます。 1 文字ではない abc.txt などにはマッチしません。
また [3-6] や [a-e] などのようにハイフンを記述することで文字の範囲を指定することができます。 [3-6] は [3456] と書いた場合と同じですし、 [a-e] は [abcde] と書いた場合と同じです。
下記では、最初に a から e までの文字で始まり任意の文字が続いたあと .txt で終わるファイルおよびディレクトリの一覧を取得し、次に c から z までの文字で始まり任意の文字が続いたあと .txt で終わるファイルおよびディレクトリの一覧を取得します。
import pathlib p = pathlib.Path('./test') for name in p.glob('[a-e]*.txt'): print(name) >> ./test\book.txt >> ./test\cup.txt for name in p.glob('[c-z]*.txt'): print(name) >> ./test\cup.txt >> ./test\pen.txt
特殊な文字を文字として扱う
* ? [] は glob 関数の中では特別な意味を持ちますが、これらの文字を単なる文字として扱い場合には [] で囲んで記述します。例えば * を 0 文字以上の任意の文字ではなく、文字として * と一致させたい場合は [*] と記述します。
サブディレクトリの含めてマッチするファイルやディレクトリを取得する
パターンの中で ** を使用すると、0 個以上のディレクトリとサブディレクトリにマッチするようになります。例えばパターンとして **/*.txt と指定した場合は a.txt や memo.txt など カレントディレクトリのファイルの他に、 ./doc/b.txt や ./doc/back/2020/report.txt などサブディレクトリにあるファイルも対象となります。
import pathlib
p = pathlib.Path('./test')
for name in p.glob('**/*.txt'):
print(name)
>> ./test\book.txt
>> ./test\cup.txt
>> ./test\pen.txt
>> ./test\back\2018.txt
>> ./test\back\2019.txt
>> ./test\back\2020.txt
>> ./test\back\old\2017.txt
サブディレクトリを再帰的に検索して条件に一致するファイルを取得します。
※ glob モジュールの glob 関数と異なり、デフォルトでサブディレクトリを再帰的に検索します。
それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 sample15-1.py という名前で保存します。
import pathlib p = pathlib.Path('./test') for name in p.glob('**/*.txt'): print(name)
プログラムと同じディレクトリの中に test という名前のディレクトリがあり、 test ディレクトリの中に次のようにファイルとディレクトリが含まれています。
その後で、次のように実行してください。
python sample15-1.py
サブディレクトリも含めて指定したパターンとマッチするファイルとディレクトリを順に取得しました。
-- --
Python の pathlib モジュールで用意されている Path.glob メソッドを使って、指定した条件に一致するファイルやディレクトリの一覧を取得する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。