[Python] ワイルドカードを使ってファイルを検索する方法

Pythonでワイルドカードを使ってファイルを検索するには、標準ライブラリのglobモジュールを使用します。

globはUnixシェルスタイルのパターンマッチングをサポートしており、*?などのワイルドカードを使ってファイル名を検索できます。

例えば、*.txtはすべてのテキストファイルを検索し、file?.txtfile1.txtfileA.txt など1文字の違いを許容するファイルを検索します。

この記事でわかること
  • globモジュールの基本的な使い方
  • ワイルドカードの種類と使い方
  • pathlibモジュールの特徴と利点
  • 複数のディレクトリからの検索方法
  • 検索結果の保存や書き出し方法

目次から探す

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.txtfileA.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.txtfile2.txtfile3.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の使用が推奨されます。

応用例

複数のディレクトリからファイルを検索する

複数のディレクトリからファイルを検索するには、globpathlibを使って、各ディレクトリを指定して検索を行うことができます。

以下の例では、dir1dir2の両方から.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ファイルに検索結果が書き込まれます。

出力結果はファイルに保存されるため、コンソールには表示されません。

よくある質問

globモジュールとosモジュールの違いは?

globモジュールは、ファイル名のパターンマッチングを行うための専用のツールで、ワイルドカードを使用して特定のファイルを簡単に検索できます。

一方、osモジュールは、ファイルシステムの操作全般を行うためのモジュールで、ファイルの作成、削除、移動、パスの操作など、より広範な機能を提供します。

globはファイル検索に特化しているため、特定のパターンに一致するファイルを見つけるのに便利ですが、osはファイルシステム全体を操作するための機能を持っています。

ワイルドカードを使って隠しファイルを検索できますか?

はい、ワイルドカードを使って隠しファイルを検索することができます。

隠しファイルは通常、ファイル名の先頭にドット.が付いています。

たとえば、.*というパターンを使用することで、すべての隠しファイルを検索できます。

以下のように記述します。

import glob
# 隠しファイルを検索
hidden_files = glob.glob(".*")
print(hidden_files)

このコードを実行すると、カレントディレクトリ内のすべての隠しファイルがリストされます。

ワイルドカードで大文字小文字を区別しない検索は可能ですか?

globモジュール自体は、大文字小文字を区別する検索を行いますが、pathlibモジュールを使用することで、大文字小文字を区別しない検索を実現することができます。

pathlibrglobメソッドを使用し、str.lower()を使ってファイル名を小文字に変換することで、比較を行うことができます。

以下の例では、.txtファイルを大文字小文字を区別せずに検索しています。

from pathlib import Path
# カレントディレクトリ内のすべてのファイルを取得
all_files = Path('.').rglob('*')
# 大文字小文字を区別せずに.txtファイルをフィルタリング
txt_files = [file for file in all_files if file.suffix.lower() == '.txt']
print(txt_files)

このように、pathlibを使用することで、大文字小文字を区別しない検索が可能になります。

まとめ

この記事では、Pythonのglobモジュールとpathlibモジュールを使用して、ファイル検索を行う方法について詳しく解説しました。

特に、ワイルドカードを使ったパターンマッチングや、複数のディレクトリからのファイル検索、特定の条件でのフィルタリングなど、実用的な応用例を紹介しました。

これらの知識を活用することで、ファイル管理やデータ処理の効率を向上させることができるでしょう。

今後は、実際のプロジェクトや日常のタスクにおいて、これらのテクニックを積極的に取り入れて、よりスムーズなファイル操作を実現してみてください。

  • URLをコピーしました!
目次から探す