[Python] ワイルドカードを使ってファイルを検索する方法
Pythonでワイルドカードを使ってファイルを検索するには、標準ライブラリのglobモジュールを使用します。
globはUnixシェルスタイルのパターンマッチングをサポートしており、*や?などのワイルドカードを使ってファイル名を検索できます。
例えば、*.txtはすべてのテキストファイルを検索し、file?.txtは file1.txt や fileA.txt など1文字の違いを許容するファイルを検索します。
globモジュールとは
globモジュールは、Pythonにおいてファイル名のパターンマッチングを行うための便利なツールです。
このモジュールを使用することで、特定のパターンに一致するファイルを簡単に検索することができます。
たとえば、特定の拡張子を持つファイルや、特定の文字列を含むファイルを見つける際に非常に役立ちます。
globモジュールは、Unixシェルスタイルのワイルドカードをサポートしており、アスタリスク*やクエスチョンマーク?、角括弧[]などを使用して、柔軟な検索が可能です。
これにより、ユーザーはファイルシステム内のファイルを効率的に管理し、必要なファイルを迅速に見つけることができます。
このモジュールは、特に大量のファイルを扱うプロジェクトや、特定の条件に基づいてファイルをフィルタリングする必要がある場合に重宝します。
次のセクションでは、globモジュールを使った具体的なファイル検索の方法について詳しく見ていきます。
ワイルドカードの基本
ワイルドカードとは
ワイルドカードとは、特定の文字列を表すために使用される特殊な文字のことです。
ファイル名やパスの検索において、ワイルドカードを使うことで、特定のパターンに一致するファイルを効率的に見つけることができます。
これにより、ユーザーはファイルシステム内の情報を柔軟に操作できるようになります。
よく使われるワイルドカードの種類
| ワイルドカード | 説明 | 例 |
|---|---|---|
| アスタリスク(*) | 0文字以上の任意の文字列に一致 | *.txt(すべてのテキストファイル) |
| クエスチョンマーク(?) | 任意の1文字に一致 | file?.jpg(file1.jpg, file2.jpgなど) |
| 角括弧([]) | 指定した文字のいずれか1文字に一致 | file[1-3].txt(file1.txt, file2.txt, file3.txt) |
アスタリスク(*)の使い方
アスタリスクは、0文字以上の任意の文字列に一致します。
たとえば、*.pyと指定すると、すべてのPythonファイル(拡張子が.pyのファイル)を検索することができます。
import glob
# カレントディレクトリ内のすべてのPythonファイルを取得
python_files = glob.glob("*.py")
print(python_files)['script1.py', 'script2.py']クエスチョンマーク(?)の使い方
クエスチョンマークは、任意の1文字に一致します。
たとえば、file?.txtと指定すると、file1.txtやfileA.txtなど、fileの後に任意の1文字が続くファイルを検索します。
import glob
# カレントディレクトリ内のfile?.txtファイルを取得
specific_files = glob.glob("file?.txt")
print(specific_files)['file1.txt', 'fileA.txt']角括弧([])の使い方
角括弧は、指定した文字のいずれか1文字に一致します。
たとえば、file[1-3].txtと指定すると、file1.txt、file2.txt、file3.txtのいずれかに一致するファイルを検索します。
import glob
# カレントディレクトリ内のfile[1-3].txtファイルを取得
range_files = glob.glob("file[1-3].txt")
print(range_files)['file1.txt', 'file2.txt', 'file3.txt']globモジュールを使ったファイル検索
ファイル名のパターンマッチング
globモジュールを使用すると、特定のパターンに一致するファイル名を簡単に検索できます。
たとえば、特定の文字列を含むファイル名を見つけることができます。
以下のコードは、dataという文字列を含むファイルを検索する例です。
import glob
# 'data'を含むファイル名を検索
matched_files = glob.glob("*data*")
print(matched_files)['data_report.txt', 'summary_data.csv']ディレクトリ内のファイルを検索する
特定のディレクトリ内のファイルを検索することも可能です。
たとえば、documentsディレクトリ内のすべてのファイルを取得する場合、以下のように記述します。
import glob
# 'documents'ディレクトリ内のすべてのファイルを取得
files_in_documents = glob.glob("documents/*")
print(files_in_documents)['documents/file1.txt', 'documents/file2.txt']サブディレクトリを含めた検索
サブディレクトリ内のファイルも検索することができます。
**を使用することで、再帰的にサブディレクトリを検索できます。
以下のコードは、すべてのサブディレクトリ内の.jpgファイルを検索する例です。
import glob
# サブディレクトリを含めたすべてのJPEGファイルを取得
all_jpg_files = glob.glob("**/*.jpg", recursive=True)
print(all_jpg_files)['images/photo1.jpg', 'images/photo2.jpg', 'backup/photo3.jpg']特定の拡張子のファイルを検索する
特定の拡張子を持つファイルを検索することも簡単です。
たとえば、すべての.txtファイルを検索する場合、以下のように記述します。
import glob
# カレントディレクトリ内のすべてのテキストファイルを取得
text_files = glob.glob("*.txt")
print(text_files)['notes.txt', 'todo.txt']複数のワイルドカードを組み合わせる
複数のワイルドカードを組み合わせて、より複雑な検索を行うことも可能です。
たとえば、dataを含む.csvファイルを検索する場合、以下のように記述します。
import glob
# 'data'を含むすべてのCSVファイルを取得
csv_files = glob.glob("*data*.csv")
print(csv_files)['sales_data.csv', 'data_summary.csv']pathlibモジュールを使ったファイル検索
pathlibモジュールの概要
pathlibモジュールは、Python 3.4以降で利用可能なファイルシステムパスを扱うためのオブジェクト指向のライブラリです。
このモジュールは、ファイルやディレクトリのパスを簡単に操作できるように設計されており、特にファイルの検索や操作を行う際に非常に便利です。
pathlibを使用することで、プラットフォームに依存しない方法でパスを扱うことができ、コードの可読性も向上します。
pathlibでのワイルドカード検索
pathlibモジュールを使用してワイルドカード検索を行うには、Pathオブジェクトのglobメソッドを利用します。
以下の例では、カレントディレクトリ内のすべての.txtファイルを検索しています。
from pathlib import Path
# カレントディレクトリを指定
current_directory = Path('.')
# カレントディレクトリ内のすべてのテキストファイルを取得
txt_files = current_directory.glob("*.txt")
for file in txt_files:
print(file)notes.txt
todo.txtまた、サブディレクトリを含めた検索も可能です。
以下のコードは、すべてのサブディレクトリ内の.jpgファイルを検索する例です。
from pathlib import Path
# カレントディレクトリを指定
current_directory = Path('.')
# サブディレクトリを含めたすべてのJPEGファイルを取得
jpg_files = current_directory.glob("**/*.jpg")
for file in jpg_files:
print(file)images/photo1.jpg
images/photo2.jpg
backup/photo3.jpgglobモジュールとの違い
globモジュールとpathlibモジュールの主な違いは、インターフェースと使い方にあります。
globは関数ベースのインターフェースであり、パターンマッチングを行うために文字列を使用します。
一方、pathlibはオブジェクト指向のアプローチを採用しており、Pathオブジェクトを使用してファイルシステムのパスを操作します。
以下に、両者の違いをまとめた表を示します。
| 特徴 | globモジュール | pathlibモジュール |
|---|---|---|
| インターフェース | 関数ベース | オブジェクト指向 |
| パターンマッチング | 文字列を使用 | Pathオブジェクトのメソッドを使用 |
| 可読性 | やや低い | 高い |
| プラットフォーム依存 | あり | なし |
このように、pathlibはより直感的で可読性の高いコードを書くことができるため、特に新しいプロジェクトではpathlibの使用が推奨されます。
応用例
複数のディレクトリからファイルを検索する
複数のディレクトリからファイルを検索するには、globやpathlibを使って、各ディレクトリを指定して検索を行うことができます。
以下の例では、dir1とdir2の両方から.txtファイルを検索しています。
import glob
# 複数のディレクトリからテキストファイルを取得
txt_files = glob.glob("dir1/*.txt") + glob.glob("dir2/*.txt")
print(txt_files)['dir1/file1.txt', 'dir2/file2.txt']ファイル名に特定の文字列を含むファイルを検索する
特定の文字列を含むファイル名を検索する場合、ワイルドカードを使用して検索を行います。
以下の例では、reportを含むファイルを検索しています。
import glob
# 'report'を含むファイル名を検索
matched_files = glob.glob("*report*.*")
print(matched_files)['sales_report.xlsx', 'annual_report.pdf']ファイルの更新日時でフィルタリングする
ファイルの更新日時でフィルタリングするには、osモジュールを使用してファイルのメタデータを取得し、条件に基づいてフィルタリングします。
以下の例では、最終更新日が1週間以内のファイルを検索しています。
import os
import time
from pathlib import Path
# 1週間前のタイムスタンプを取得
one_week_ago = time.time() - 7 * 24 * 60 * 60
# カレントディレクトリ内のファイルをフィルタリング
recent_files = [file for file in Path('.').glob('*') if file.stat().st_mtime > one_week_ago]
print(recent_files)[PosixPath('new_file.txt'), PosixPath('updated_file.py')]検索結果をリストに保存する
検索結果をリストに保存することは簡単です。
以下の例では、特定の拡張子を持つファイルをリストに保存しています。
import glob
# .csvファイルをリストに保存
csv_files = glob.glob("*.csv")
print(csv_files)['data1.csv', 'data2.csv']検索結果をファイルに書き出す
検索結果をファイルに書き出すには、通常のファイル操作を使用します。
以下の例では、検索したファイル名をoutput.txtに書き出しています。
import glob
# .txtファイルを検索
txt_files = glob.glob("*.txt")
# 検索結果をファイルに書き出す
with open("output.txt", "w") as f:
for file in txt_files:
f.write(file + "\n")このコードを実行すると、output.txtファイルに検索結果が書き込まれます。
出力結果はファイルに保存されるため、コンソールには表示されません。
まとめ
この記事では、Pythonのglobモジュールとpathlibモジュールを使用して、ファイル検索を行う方法について詳しく解説しました。
特に、ワイルドカードを使ったパターンマッチングや、複数のディレクトリからのファイル検索、特定の条件でのフィルタリングなど、実用的な応用例を紹介しました。
これらの知識を活用することで、ファイル管理やデータ処理の効率を向上させることができるでしょう。
今後は、実際のプロジェクトや日常のタスクにおいて、これらのテクニックを積極的に取り入れて、よりスムーズなファイル操作を実現してみてください。