[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.jpg
globモジュールとの違い
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
モジュールを使用して、ファイル検索を行う方法について詳しく解説しました。
特に、ワイルドカードを使ったパターンマッチングや、複数のディレクトリからのファイル検索、特定の条件でのフィルタリングなど、実用的な応用例を紹介しました。
これらの知識を活用することで、ファイル管理やデータ処理の効率を向上させることができるでしょう。
今後は、実際のプロジェクトや日常のタスクにおいて、これらのテクニックを積極的に取り入れて、よりスムーズなファイル操作を実現してみてください。