[Python] globを用いてファイル名を取得する方法
Pythonのglobモジュールを使用すると、指定したパターンに一致するファイル名を簡単に取得できます。
glob.glob()関数に検索パターンを渡すことで、ワイルドカードを使ったファイル検索が可能です。
例えば、*.txtと指定すれば、カレントディレクトリ内のすべてのテキストファイルを取得できます。
再帰的に検索したい場合は、**を使用し、recursive=Trueオプションを指定します。
結果はリスト形式で返されます。
globモジュールとは
Pythonのglobモジュールは、ファイル名のパターンマッチングを行うための便利なツールです。
特定のパターンに一致するファイル名を取得することができ、ファイル操作を効率的に行うことができます。
特に、ワイルドカードを使用してファイルを検索する際に非常に役立ちます。
globモジュールの概要
globモジュールは、Unixシェルスタイルのパターンマッチングを使用して、ファイルシステム内のファイル名を検索します。
これにより、特定の条件に合致するファイルを簡単に見つけることができます。
例えば、特定の拡張子を持つファイルや、特定の文字列を含むファイルを検索することが可能です。
globモジュールのインポート方法
globモジュールを使用するには、まずインポートする必要があります。
以下のようにインポートします。
import globglobとosモジュールの違い
globモジュールとosモジュールは、どちらもファイルシステムに関連する機能を提供しますが、主な違いは以下の通りです。
| 特徴 | globモジュール | osモジュール |
|---|---|---|
| パターンマッチング | ワイルドカードを使用してファイル名を検索 | ファイルやディレクトリの操作を行う |
| 検索の簡便さ | 簡単に特定のパターンで検索可能 | より詳細な操作が必要 |
| 戻り値 | 一致するファイル名のリスト | ファイルやディレクトリの情報 |
globモジュールの用途
globモジュールは、以下のような用途で使用されます。
- 特定の拡張子を持つファイルの検索
- サブディレクトリ内のファイルの取得
- 一括処理を行うためのファイルリストの作成
- ファイル名のフィルタリング
これにより、ファイル操作を効率的に行うことができ、プログラムの可読性も向上します。
globを使った基本的なファイル名の取得方法
globモジュールを使用することで、特定のパターンに一致するファイル名を簡単に取得できます。
ここでは、globモジュールの基本的な使い方について解説します。
glob.glob()の基本的な使い方
glob.glob()関数を使用すると、指定したパターンに一致するファイル名のリストを取得できます。
基本的な構文は以下の通りです。
import glob
# パターンに一致するファイル名を取得
file_list = glob.glob('*.txt') # カレントディレクトリ内の全てのテキストファイルを取得
print(file_list)このコードを実行すると、カレントディレクトリ内の全ての.txtファイルのリストが表示されます。
ワイルドカードを使ったファイル検索
globモジュールでは、ワイルドカードを使用してファイル名を検索できます。
以下のワイルドカードが利用可能です。
*: 任意の文字列(0文字以上)にマッチ?: 任意の1文字にマッチ[]: 指定した文字のいずれか1文字にマッチ
例えば、以下のコードでは、カレントディレクトリ内の全ての.jpgファイルを取得します。
import glob
# カレントディレクトリ内の全てのJPEGファイルを取得
file_list = glob.glob('*.jpg')
print(file_list)ファイルパスの取得と表示
glob.glob()は基本的にファイル名しか取得できません。ファイルのパスも取得する場合は、以下のようにos.path.abspath()を使用して各ファイルのフルパスを取得することができます。
以下の例では、特定のディレクトリ内の全ての.pyファイルのパスを取得します。
import glob
import os
import pprint
# 特定のディレクトリ内の全てのPythonファイルを取得
file_list = glob.glob('*.py')
# 各ファイルのフルパスを取得
full_path_list = [os.path.abspath(file) for file in file_list]
# リストを整形して出力
pprint.pprint(full_path_list)このコードを実行すると、指定したディレクトリ内の全てのPythonファイルのフルパスが表示されます。
絶対パスと相対パスの違い
- 絶対パス: ファイルシステムのルートからの完全なパス。
例: /home/user/documents/file.txt
- 相対パス: 現在の作業ディレクトリからの相対的なパス。
例: documents/file.txt
globモジュールを使用する際、絶対パスを指定することで、特定の場所にあるファイルを確実に取得できます。
一方、相対パスを使用すると、現在の作業ディレクトリに依存した検索が行われます。
ワイルドカードの使い方
globモジュールでは、ワイルドカードを使用してファイル名を柔軟に検索することができます。
ここでは、各ワイルドカードの使い方について詳しく解説します。
*を使った任意の文字列の検索
*は任意の文字列(0文字以上)にマッチします。
これを使うことで、特定の拡張子を持つ全てのファイルを簡単に取得できます。
以下の例では、カレントディレクトリ内の全てのファイルを取得します。
import glob
# カレントディレクトリ内の全てのファイルを取得
file_list = glob.glob('*')
print(file_list)このコードを実行すると、カレントディレクトリ内の全てのファイル名が表示されます。
?を使った1文字の検索
?は任意の1文字にマッチします。
これを使うことで、特定の文字数のファイル名を検索できます。
以下の例では、拡張子が.txtで、ファイル名が3文字のファイルを取得します。
import glob
# カレントディレクトリ内の3文字のテキストファイルを取得
file_list = glob.glob('???.txt')
print(file_list)このコードを実行すると、ファイル名が3文字の.txtファイルが表示されます。
[]を使った特定の文字の検索
[]を使用すると、指定した文字のいずれか1文字にマッチします。
これを使うことで、特定の文字を含むファイル名を検索できます。
以下の例では、aまたはbで始まる.jpgファイルを取得します。
import glob
# カレントディレクトリ内のaまたはbで始まるJPEGファイルを取得
file_list = glob.glob('[ab]*.jpg')
print(file_list)このコードを実行すると、aまたはbで始まる全ての.jpgファイルが表示されます。
複数の拡張子を同時に検索する方法
複数の拡張子を同時に検索する場合、globモジュールを使って複数のパターンを指定することができます。
以下の例では、.txtと.csvの両方のファイルを取得します。
import glob
# カレントディレクトリ内の全てのテキストファイルとCSVファイルを取得
file_list_txt = glob.glob('*.txt')
file_list_csv = glob.glob('*.csv')
file_list = file_list_txt + file_list_csv
print(file_list)このコードを実行すると、カレントディレクトリ内の全ての.txtファイルと.csvファイルが表示されます。
複数の拡張子を同時に検索することで、必要なファイルを効率的に取得できます。
再帰的なファイル検索
globモジュールを使用すると、再帰的にファイルを検索することができます。
これにより、サブディレクトリ内のファイルも含めて、特定のパターンに一致するファイルを取得することが可能です。
ここでは、再帰的なファイル検索の方法について解説します。
**を使った再帰的な検索
**を使用することで、任意の深さのサブディレクトリを含む再帰的な検索が可能です。
以下の例では、カレントディレクトリ以下の全ての.txtファイルを取得します。
import glob
# カレントディレクトリ以下の全てのテキストファイルを再帰的に取得
file_list = glob.glob('**/*.txt', recursive=True)
print(file_list)このコードを実行すると、カレントディレクトリ内の全てのサブディレクトリを含む.txtファイルのリストが表示されます。
recursive=Trueオプションの使い方
glob.glob()関数には、recursive=Trueオプションを指定することで、再帰的な検索を行うことができます。
以下の例では、全ての.pyファイルを再帰的に取得します。
import glob
# カレントディレクトリ以下の全てのPythonファイルを再帰的に取得
file_list = glob.glob('**/*.py', recursive=True)
print(file_list)このコードを実行すると、全てのサブディレクトリを含む.pyファイルのリストが表示されます。
サブディレクトリ内のファイルを取得する方法
特定のサブディレクトリ内のファイルを取得する場合、パスを指定することで簡単に検索できます。
以下の例では、subdirというサブディレクトリ内の全ての.jpgファイルを取得します。
import glob
# subdir内の全てのJPEGファイルを取得
file_list = glob.glob('subdir/*.jpg')
print(file_list)このコードを実行すると、subdir内の全ての.jpgファイルが表示されます。
再帰検索のパフォーマンスに関する注意点
再帰的な検索は便利ですが、パフォーマンスに影響を与えることがあります。
特に、深い階層のディレクトリ構造や大量のファイルが存在する場合、検索に時間がかかることがあります。
以下の点に注意してください。
- 検索範囲を絞る: 必要なディレクトリのみを指定することで、検索時間を短縮できます。
- ファイル数の管理: 大量のファイルが存在する場合、結果のリストが大きくなり、メモリを消費する可能性があります。
- キャッシュの利用: 同じ検索を繰り返す場合、結果をキャッシュすることでパフォーマンスを向上させることができます。
これらの点に留意しながら、再帰的なファイル検索を活用してください。
ファイル名のフィルタリング
globモジュールを使用すると、特定の条件に基づいてファイル名をフィルタリングすることができます。
ここでは、特定の拡張子や文字列を含むファイル名の検索方法について解説します。
特定の拡張子のファイルを取得する方法
特定の拡張子を持つファイルを取得するには、ワイルドカードを使用してパターンを指定します。
以下の例では、カレントディレクトリ内の全ての.csvファイルを取得します。
import glob
# カレントディレクトリ内の全てのCSVファイルを取得
file_list = glob.glob('*.csv')
print(file_list)このコードを実行すると、カレントディレクトリ内の全ての.csvファイルのリストが表示されます。
特定の文字列を含むファイル名の検索
特定の文字列を含むファイル名を検索する場合、ワイルドカードを組み合わせて使用します。
以下の例では、ファイル名にreportを含む全ての.txtファイルを取得します。
import glob
# カレントディレクトリ内のファイル名に'report'を含むテキストファイルを取得
file_list = glob.glob('*report*.txt')
print(file_list)このコードを実行すると、ファイル名にreportを含む全ての.txtファイルが表示されます。
大文字・小文字を区別しない検索方法
globモジュールは大文字・小文字を区別するため、特定の拡張子を持つファイルを大文字・小文字を問わず取得するには、fnmatchモジュールを併用することができます。
以下の例では、.jpgまたは.JPGのファイルを取得します。
import glob
import fnmatch
# カレントディレクトリ内の全てのJPEGファイルを大文字・小文字を区別せずに取得
file_list = [f for f in glob.glob('*') if fnmatch.fnmatch(f, '*.jpg') or fnmatch.fnmatch(f, '*.JPG')]
print(file_list)このコードを実行すると、.jpgおよび.JPGの全てのファイルが表示されます。
ファイル名のソート方法
取得したファイル名をソートするには、sorted()関数を使用します。
以下の例では、カレントディレクトリ内の全ての.txtファイルを取得し、ファイル名をアルファベット順にソートします。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob('*.txt')
# ファイル名をアルファベット順にソート
sorted_file_list = sorted(file_list)
print(sorted_file_list)このコードを実行すると、カレントディレクトリ内の全ての.txtファイルがアルファベット順に表示されます。
ファイル名のソートを行うことで、結果を見やすく整理することができます。
応用例:globを使ったファイル操作
globモジュールを活用することで、特定の条件に一致するファイルに対して一括操作を行うことができます。
ここでは、ファイルの一括削除、一括リネーム、一括コピー、一括移動の方法について解説します。
ファイルの一括削除
特定の拡張子を持つファイルを一括で削除するには、osモジュールのremove()関数を使用します。
以下の例では、カレントディレクトリ内の全ての.tmpファイルを削除します。
import glob
import os
# カレントディレクトリ内の全ての.tmpファイルを取得
file_list = glob.glob('*.tmp')
# 一括削除
for file in file_list:
os.remove(file)
print(f'{file} を削除しました。')このコードを実行すると、カレントディレクトリ内の全ての.tmpファイルが削除されます。
ファイルの一括リネーム
ファイル名を一括でリネームするには、osモジュールのrename()関数を使用します。
以下の例では、カレントディレクトリ内の全ての.txtファイルの拡張子を.bakに変更します。
import glob
import os
# カレントディレクトリ内の全ての.txtファイルを取得
file_list = glob.glob('*.txt')
# 一括リネーム
for file in file_list:
new_name = file.replace('.txt', '.bak')
os.rename(file, new_name)
print(f'{file} を {new_name} にリネームしました。')このコードを実行すると、全ての.txtファイルが.bakにリネームされます。
ファイルの一括コピー
ファイルを一括でコピーするには、shutilモジュールのcopy()関数を使用します。
以下の例では、カレントディレクトリ内の全ての.jpgファイルをbackupフォルダにコピーします。
import glob
import shutil
import os
# カレントディレクトリ内の全ての.jpgファイルを取得
file_list = glob.glob('*.jpg')
# コピー先のディレクトリを作成
os.makedirs('backup', exist_ok=True)
# 一括コピー
for file in file_list:
shutil.copy(file, 'backup/')
print(f'{file} を backup/ にコピーしました。')このコードを実行すると、全ての.jpgファイルがbackupフォルダにコピーされます。
ファイルの一括移動
ファイルを一括で移動するには、shutilモジュールのmove()関数を使用します。
以下の例では、カレントディレクトリ内の全ての.pdfファイルをarchiveフォルダに移動します。
import glob
import shutil
import os
# カレントディレクトリ内の全ての.pdfファイルを取得
file_list = glob.glob('*.pdf')
# 移動先のディレクトリを作成
os.makedirs('archive', exist_ok=True)
# 一括移動
for file in file_list:
shutil.move(file, 'archive/')
print(f'{file} を archive/ に移動しました。')このコードを実行すると、全ての.pdfファイルがarchiveフォルダに移動されます。
これにより、ファイルの整理が効率的に行えます。
まとめ
この記事では、Pythonのglobモジュールを使用してファイル名を取得する方法や、ワイルドカードを使った検索、再帰的なファイル検索、ファイル名のフィルタリング、さらには一括操作の応用例について詳しく解説しました。
これにより、特定の条件に基づいてファイルを効率的に操作する手法を学ぶことができました。
今後は、実際のプロジェクトや日常のファイル管理において、globモジュールを活用して作業を効率化してみてください。