【Python】ワイルドカードとは?文字列やファイル検索の方法を初心者向けに解説
はじめに
プログラミングでファイルをまとめて扱いたいときや、文字列を部分的に検索したいときに役立つのがワイルドカードです。
例えば、.csv
ファイルだけを抽出したい、あるいはログファイルの中から特定のパターンを持つ名前のものを探したい、という場面があります。
Pythonではglobモジュールやfnmatchモジュールを使うと、ワイルドカードを用いた探索やパターンマッチングができるのでとても便利です。
ただ、初心者の方は「ワイルドカード」と聞いてもピンとこないかもしれません。
そこで、本記事ではワイルドカードの仕組みを具体例とともにお伝えします。
実務に近い場面を想定しながら進めていきますので、業務や学習でぜひ活用してみてください。
この記事を読むとわかること
- Pythonにおけるワイルドカードの基本的な考え方
- ファイル検索で使うglobモジュールの活用方法
- fnmatchモジュールによるパターンマッチングのポイント
- 実務で役立つ応用例と注意点
ワイルドカードの基本
ワイルドカードとは、一部の文字が何でも当てはまるという意味を持つ記号のことです。
単純にいうと、ファイル名や文字列の中で特定のパターンを指定するときに使われます。
ワイルドカードを使いこなすと「特定の拡張子だけまとめて扱う」「あるルールに沿った名前のファイルだけ取得する」といった処理が可能になるでしょう。
よく使われるワイルドカード記号
ワイルドカードには複数の記号があり、Pythonの各モジュールでは基本的に以下のような意味合いを持ちます。
*
:任意の文字列(0文字以上)?
:任意の1文字[...]
:指定した文字のいずれか1文字
例えば、*.py
と指定すると拡張子が .py
のファイルが対象になります。
一方で、data_?.csv
と書けば data_1.csv
や data_A.csv
は合致しますが data_10.csv
は対象外になるというイメージです。
実務での利用シーン
実務でワイルドカードが役立つシーンは主にファイル操作やログの解析です。
例えば、ディレクトリにある複数のCSVファイルを一度に処理するとき、拡張子が .csv
のファイルだけをまとめて取得することがよくあります。
また、統一したルールで作られるログファイルを取り扱う場合にも「決まった接頭辞+日付」という形式のファイル名をワイルドカードで指定して、一括で読み込むことができるでしょう。
ログを自動で集計したり、データをまとめて加工したりする際に欠かせない機能です。
こうした場面でワイルドカードを意識していると、開発中のコードをシンプルに保ちやすくなります。
Pythonでのワイルドカード活用例
ここでは、Pythonでワイルドカードを使う方法をいくつかご紹介します。
ファイル検索や文字列マッチングを行う際に便利なモジュールが用意されているので、具体例を通して見ていきましょう。
globモジュールによるファイル検索
まずはglobモジュールを使った例です。
Python標準ライブラリのひとつで、ディレクトリ内のファイルやフォルダをパターンで指定して一覧取得することができます。
import glob # カレントディレクトリにある .csv ファイルをすべて取得 csv_files = glob.glob("*.csv") print(csv_files)
このコードを実行すると、現在の作業ディレクトリ内に存在する .csv
ファイルをリスト形式で取得できます。
実務では、これで取得したファイルをループで回して内容を読み込むといった流れになります。
たとえばデータ分析をするときに、日ごとに保存されるCSVファイルをまとめて解析したい場合に役立ちます。
再帰的な探索をするパターン
glob()
関数には「再帰的にサブディレクトリまで探索する」という使い方も存在します。
例えば、カレントディレクトリ配下にあるすべての .csv
ファイルを探す場合は次のように書けます。
import glob # 再帰的に .csv ファイルを探す all_csv_files = glob.glob("**/*.csv", recursive=True) print(all_csv_files)
ファイル構造が階層的に分かれていても、これで任意の場所にあるCSVファイルを取得できます。
一括処理するときはとても便利です。
fnmatchモジュールによるパターンマッチング
次に、ファイル名や文字列に対してワイルドカードで合致するかどうかを判定する方法を見てみましょう。
fnmatchモジュールを使うと、一つひとつの文字列をワイルドカードパターンと照らし合わせてTrueまたはFalseで返してくれます。
import fnmatch filename = "data_2025.csv" pattern = "data_*.csv" if fnmatch.fnmatch(filename, pattern): print("指定したパターンに合致しました。") else: print("パターンに合致しませんでした。")
ここでは data_*.csv
というワイルドカードパターンに対して、data_2025.csv
が合致するかどうかを調べています。
実務で、複数のファイル名や文字列がある状況で合致・非合致を振り分けたい場合に便利です。
fnmatch.filter() の活用
fnmatch
モジュールにはfilter() 関数も用意されています。
これは、リストの中から条件に合致する文字列だけを抽出してくれる関数です。
import fnmatch filenames = ["report_01.csv", "report_02.csv", "image.png", "report_03.csv"] matched = fnmatch.filter(filenames, "report_*.csv") print(matched) # ['report_01.csv', 'report_02.csv', 'report_03.csv']
このように、リストの中からワイルドカードに合う要素だけを取り出すことができます。
ファイルパスをまとめて持っているときや、実際のファイル検索結果を更に絞り込みたいときなどに役立つでしょう。
正規表現との違い
Pythonには文字列操作に欠かせないreモジュール(正規表現)もありますが、ワイルドカードとは用途が少し異なります。
- ワイルドカード:ファイル名や単純な文字列検索に便利
- 正規表現:パターンが複雑な場合や、特殊なマッチングを行う場合に向いている
例えば、数字だけにマッチしたい場合や、ある特定の文字列パターンを抽出したい場合は正規表現が有効です。
一方で、拡張子や単純な前後文字列の指定ならワイルドカードで十分対応できます。
実務では両者を使い分けることが多いでしょう。
いずれも「文字列パターンを指定して、マッチングするものを見つけたい」という点で似ていますが、書き方や得意分野が違うと覚えておくと良いですね。
実務で役立つポイント
ここではワイルドカードを実際に使うにあたって、知っておくと役立つポイントや注意点をまとめます。
複数パターンを組み合わせる場合
たとえば、同時に複数の拡張子を扱いたいときがあるかもしれません。
ただし、globやfnmatchではワイルドカードパターンをひとつずつ指定するのが基本です。
そのため、拡張子が .csv
または .txt
のファイルを一度に取得したい場合は、2回に分けてリストを取得した上で結合すると良いでしょう。
import glob csv_files = glob.glob("*.csv") txt_files = glob.glob("*.txt") all_files = csv_files + txt_files
パターンを二つつなげるような書き方は標準的には用意されていないので、複数のパターンを組み合わせたい場合は手動で対応すると混乱を防げます。
絶対パスと相対パスに注意する
globやfnmatchは基本的に文字列同士のマッチングを行うものです。
つまり、パスの指定が相対なのか絶対なのかによって結果が変わる場合があります。
ファイル検索のときに思わぬ結果が出ることを避けるには、常にどのパスを基準に処理しているのか確認しながら進めると安心です。
大文字・小文字を区別するかどうか
Windows環境ではファイルシステムが大文字・小文字を区別しないことが多いですが、Unix系の環境(macOSやLinux)では区別します。
ワイルドカードを使うときも環境によって結果が異なることがあるため、マッチングがうまくいかない場合はこの点をチェックしてみましょう。
fnmatchには fnmatchcase()
という関数があり、大文字・小文字を区別したいときに使えます。
import fnmatch print(fnmatch.fnmatchcase("Report.csv", "*.CSV")) # False
上記のように、.CSV
と大文字で書いたパターンでは合致しないため注意が必要です。
見落としがちな「隠しファイル」や特殊ファイル
macOSやLinux系の環境では、先頭にドットがついたファイル(例:.DS_Store
)は隠しファイルと呼ばれます。
globを使う際に "*"
や "*.csv"
としていても、ドットで始まるファイルは除外されるケースがあります。
もし隠しファイルも含めて処理したいならパターンを ".*"
と書くなど工夫しましょう。
ただし、そうすると不要なファイルまで取得してしまう可能性があるので、実務ではプロジェクトのルールに合わせて運用することが大切です。
ワイルドカードを使った具体例
ここでは、実務に近い処理例をまとめてみます。
複数のCSVファイルを一括で処理して、特定のキーワードを含む行だけを抽出するというイメージです。
import glob # 例として、複数の .csv ファイルを集めて内容を順番に処理 csv_files = glob.glob("*.csv") results = [] for file in csv_files: with open(file, "r", encoding="utf-8") as f: for line in f: # ここでは「ERROR」という文字列が含まれている行だけを抽出 if "ERROR" in line: results.append((file, line.strip())) # 見つかった行をまとめて確認する for item in results: filename, text_line = item print(f"{filename}: {text_line}")
上記のコードでは、glob("*.csv")
によってカレントディレクトリにある .csv
ファイルを一括で取得しています。
そして、各ファイルを開いて行単位で読み込み、"ERROR"
という文字列を含む行を抽出してリストに格納するという流れです。
このようなコードは、ログ解析やエラーチェックなどの用途でよく見かけます。
ワイルドカードで対象ファイルをまとめて処理するメリットとして、ファイル数が増減したとしてもコードの修正が最小限で済むという点が挙げられます。
手動でファイル名を指定していたら、ファイルが増えるたびにコードを書き換えなければいけませんが、ワイルドカードを使えばファイル名のルールを変えない限り追加作業は不要でしょう。
ファイル数が極端に多い場合、すべて取得してから処理すると時間がかかる可能性があります。 サブディレクトリを含めて探索するときは特に注意が必要です。
実務での注意点
ここまで紹介してきたように、ワイルドカードを使うと便利な場面は多いです。
ただし、特にチームで開発している場合は以下の点に気をつけましょう。
フォルダ構成のルール
ファイル名のルールが複雑だと、ワイルドカードで簡潔に指定しきれないケースもあります。
例えば、report_sales_yyyy.csv
と report_marketing_yyyy.csv
のように命名ルールがバラバラだと、一括取得がしづらくなります。
実務では、チーム全体でファイルの命名規則を明確にしておくと、ワイルドカードの恩恵を受けやすくなります。
安易なパターン指定による誤取得
*
は非常に強力で、どんな文字列にも合致してしまう分、予期せぬファイルまで拾ってしまうことがあります。
特に削除や上書きを行う処理にワイルドカードを使う場合は、対象ファイルを事前にログ出力するなどして、想定外のものを巻き込まないようにしましょう。
fnmatchとglobの違い
glob
はディレクトリを巡回してファイルを探すために特化したモジュールです。
一方で fnmatch
は、単に文字列パターンに対して合致するかどうかを返す仕組みです。
両者を一緒に考えると混乱する方もいるかもしれません。
「ファイルを検索したいだけならglob」「すでに得られた文字列やファイル名に対して検証するならfnmatch」と大まかに覚えておくと良いでしょう。
まとめ
ワイルドカードを使えば、たくさんのファイルや複雑な名前のファイルも柔軟に扱えます。
globモジュールではパターンでファイル検索を行い、fnmatchモジュールでは与えられた文字列がパターンに合致するかを調べられるというイメージです。
それぞれの用途や環境に合わせて使い分けてみてください。
また、実務レベルでは命名規則の整備やパフォーマンス面の配慮が重要になります。
ワイルドカードを上手に活用することで、ファイル操作やデータ処理のコードがすっきりと書きやすくなるでしょう。
今後、ファイル名やログに関わる処理を行うときは、ぜひこの記事の内容を参考にしてみてください。