[Python] 複数のファイルをまとめて読み込む方法
Pythonで複数のファイルをまとめて読み込む方法として、glob
モジュールやos
モジュールを使用する方法があります。
glob
モジュールを使うと、特定のパターンに一致するファイルを簡単に取得できます。
例えば、glob.glob('*.txt')
でカレントディレクトリ内のすべてのテキストファイルを取得し、for
ループで各ファイルを開いて処理することが可能です。
また、os.listdir()
を使ってディレクトリ内のファイルをリスト化し、同様に処理することもできます。
Pythonで複数ファイルを読み込む基本的な方法
Pythonでは、複数のファイルを効率的に読み込むためのさまざまな方法があります。
ここでは、glob
、os
、pathlib
モジュールを使ったファイルの取得やリスト化、そして基本的な読み込みの流れについて解説します。
globモジュールを使ったファイルの取得
glob
モジュールは、特定のパターンにマッチするファイル名を取得するための便利なツールです。
ワイルドカードを使用して、特定の拡張子を持つファイルを簡単に取得できます。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 取得したファイル名を表示
for file_name in file_list:
print(file_name)
file1.txt
file2.txt
example.txt
osモジュールを使ったファイルのリスト化
os
モジュールを使用すると、ディレクトリ内のファイルをリスト化することができます。
os.listdir()
を使って、指定したディレクトリ内の全てのファイルとフォルダを取得できます。
import os
# カレントディレクトリ内の全てのファイルとフォルダを取得
file_list = os.listdir(".")
# 取得したファイル名を表示
for file_name in file_list:
print(file_name)
file1.txt
file2.txt
example.txt
folder1
folder2
pathlibモジュールを使ったファイル操作
pathlib
モジュールは、オブジェクト指向のファイルシステムパスを扱うためのモジュールです。
Path
オブジェクトを使って、ファイルやディレクトリの操作を行うことができます。
from pathlib import Path
# カレントディレクトリのPathオブジェクトを作成
path = Path(".")
# 全てのテキストファイルを取得
file_list = list(path.glob("*.txt"))
# 取得したファイル名を表示
for file in file_list:
print(file.name)
file1.txt
file2.txt
example.txt
ファイルの読み込みと処理の基本的な流れ
複数のファイルを読み込む際の基本的な流れは以下の通りです。
- ファイルのリストを取得する。
- 各ファイルを開く。
- ファイルの内容を読み込む。
- 必要な処理を行う。
- ファイルを閉じる。
以下は、テキストファイルを読み込んで内容を表示するサンプルコードです。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 各ファイルを開いて内容を表示
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(f"--- {file_name} ---")
print(content)
--- file1.txt ---
内容1
--- file2.txt ---
内容2
--- example.txt ---
内容3
このように、Pythonを使って複数のファイルを効率的に読み込むことができます。
各モジュールの特性を理解し、適切な方法を選択することが重要です。
globモジュールを使ったファイルの読み込み
glob
モジュールは、Unixシェルスタイルのパターンマッチングを使用して、ファイル名を検索するためのモジュールです。
特定のパターンに一致するファイルを簡単に取得できるため、複数のファイルを扱う際に非常に便利です。
globモジュールとは?
glob
モジュールは、ファイルシステム内のファイル名をパターンに基づいて検索するための標準ライブラリです。
特に、ワイルドカード*
や?
を使用して、特定の条件に合ったファイルを取得することができます。
import glob
# globモジュールの使用例
file_list = glob.glob("*.txt") # カレントディレクトリ内の全てのテキストファイルを取得
print(file_list)
['file1.txt', 'file2.txt', 'example.txt']
ワイルドカードを使ったファイルの検索
glob
モジュールでは、ワイルドカードを使用してファイルを検索できます。
以下のようなワイルドカードが利用可能です。
ワイルドカード | 説明 |
---|---|
* | 0文字以上の任意の文字列 |
? | 任意の1文字 |
[abc] | a、b、cのいずれかの1文字 |
[a-z] | aからzまでの任意の1文字 |
例えば、特定のパターンに一致するファイルを検索することができます。
import glob
# カレントディレクトリ内の全てのファイルを取得
file_list = glob.glob("file?.txt") # file1.txt, file2.txt など
print(file_list)
['file1.txt', 'file2.txt']
ファイルのパスを取得して読み込む方法
glob
モジュールを使用して取得したファイルのパスを使って、ファイルを読み込むことができます。
以下は、取得したファイルを開いて内容を表示する例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 各ファイルを開いて内容を表示
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(f"--- {file_name} ---")
print(content)
--- file1.txt ---
内容1
--- file2.txt ---
内容2
--- example.txt ---
内容3
サブディレクトリ内のファイルも含めて検索する方法
glob
モジュールを使用して、サブディレクトリ内のファイルも検索することができます。
**
を使うことで、再帰的にファイルを検索することが可能です。
import glob
# サブディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("**/*.txt", recursive=True)
# 取得したファイル名を表示
for file_name in file_list:
print(file_name)
folder1/file1.txt
folder2/file2.txt
example.txt
このように、glob
モジュールを使うことで、特定のパターンに一致するファイルを簡単に検索し、読み込むことができます。
特にサブディレクトリ内のファイルも含めて検索できる点が、非常に便利です。
osモジュールを使ったファイルの読み込み
os
モジュールは、オペレーティングシステムとのインターフェースを提供するための標準ライブラリです。
ファイルやディレクトリの操作を行うための多くの関数が含まれており、特にファイルのリスト化やパスの操作に便利です。
os.listdir()を使ったファイルのリスト化
os.listdir()関数
を使用すると、指定したディレクトリ内の全てのファイルとフォルダのリストを取得できます。
この関数は、ディレクトリ内のアイテムをリスト形式で返します。
import os
# カレントディレクトリ内の全てのファイルとフォルダを取得
file_list = os.listdir(".")
# 取得したファイル名を表示
for file_name in file_list:
print(file_name)
file1.txt
file2.txt
example.txt
folder1
folder2
ファイルパスの結合にos.path.join()を使う
ファイルパスを結合する際には、os.path.join()
を使用することで、OSに依存しない形でパスを作成できます。
これにより、異なるプラットフォーム間での互換性が保たれます。
import os
# ディレクトリ名とファイル名を結合
directory = "folder1"
file_name = "file1.txt"
full_path = os.path.join(directory, file_name)
print(full_path)
folder1/file1.txt
ファイルの存在確認とエラーハンドリング
ファイルを操作する前に、そのファイルが存在するかどうかを確認することが重要です。
os.path.exists()
を使用して、ファイルの存在を確認できます。
また、エラーハンドリングを行うことで、ファイルが存在しない場合の処理を適切に行うことができます。
import os
file_name = "file1.txt"
# ファイルの存在確認
if os.path.exists(file_name):
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(content)
else:
print(f"{file_name} は存在しません。")
内容1
(ファイルが存在しない場合)
file1.txt は存在しません。
サブディレクトリ内のファイルを再帰的に処理する方法
os
モジュールを使用して、サブディレクトリ内のファイルを再帰的に処理することができます。
os.walk()
を使うことで、指定したディレクトリ以下の全てのファイルとフォルダを取得できます。
import os
# サブディレクトリ内の全てのファイルを再帰的に処理
for dirpath, dirnames, filenames in os.walk("."):
for file_name in filenames:
full_path = os.path.join(dirpath, file_name)
print(full_path)
./file1.txt
./file2.txt
./example.txt
./folder1/file1.txt
./folder2/file2.txt
このように、os
モジュールを使用することで、ファイルのリスト化やパスの結合、存在確認、さらにはサブディレクトリ内のファイルを再帰的に処理することが可能です。
これにより、ファイル操作がより効率的に行えるようになります。
pathlibモジュールを使ったファイルの読み込み
pathlib
モジュールは、Python 3.4以降で利用可能な、オブジェクト指向のファイルシステムパスを扱うためのモジュールです。
これにより、ファイルやディレクトリの操作がより直感的に行えるようになります。
pathlibモジュールの基本
pathlib
モジュールでは、Path
オブジェクトを使用してファイルシステムのパスを表現します。
これにより、パスの操作が簡単になり、可読性も向上します。
from pathlib import Path
# カレントディレクトリのPathオブジェクトを作成
current_path = Path(".")
# カレントディレクトリ内の全てのファイルとフォルダを表示
for item in current_path.iterdir():
print(item)
file1.txt
file2.txt
example.txt
folder1
folder2
Path.glob()を使ったファイル検索
Path.glob()メソッド
を使用すると、特定のパターンに一致するファイルを検索できます。
ワイルドカードを使って、特定の拡張子を持つファイルを簡単に取得できます。
from pathlib import Path
# カレントディレクトリ内の全てのテキストファイルを取得
path = Path(".")
file_list = path.glob("*.txt")
# 取得したファイル名を表示
for file in file_list:
print(file.name)
file1.txt
file2.txt
example.txt
ファイルパスの操作と読み込み
pathlib
を使用すると、ファイルパスの操作が簡単になります。
Path
オブジェクトを使って、ファイルを開いて内容を読み込むことができます。
from pathlib import Path
# カレントディレクトリ内の全てのテキストファイルを取得
path = Path(".")
file_list = path.glob("*.txt")
# 各ファイルを開いて内容を表示
for file in file_list:
with file.open('r', encoding='utf-8') as f:
content = f.read()
print(f"--- {file.name} ---")
print(content)
--- file1.txt ---
内容1
--- file2.txt ---
内容2
--- example.txt ---
内容3
pathlibを使った再帰的なファイル処理
pathlib
を使用すると、サブディレクトリ内のファイルを再帰的に処理することも簡単です。
Path.rglob()メソッド
を使うことで、指定したパターンに一致する全てのファイルを再帰的に検索できます。
from pathlib import Path
# サブディレクトリ内の全てのテキストファイルを再帰的に取得
path = Path(".")
file_list = path.rglob("*.txt")
# 取得したファイル名を表示
for file in file_list:
print(file)
folder1/file1.txt
folder2/file2.txt
example.txt
このように、pathlib
モジュールを使用することで、ファイルの検索や操作が直感的に行えるようになります。
特に、再帰的なファイル処理が簡単にできる点が大きな利点です。
複数ファイルの内容を一括で処理する方法
複数のファイルを一括で処理する際には、効率的な方法を選択することが重要です。
ここでは、ファイルを一つずつ開いて処理する方法や、内容をリストに格納する方法、メモリ効率を考慮した逐次処理、エラーハンドリングについて解説します。
ファイルを一つずつ開いて処理する方法
複数のファイルを一つずつ開いて処理する基本的な方法は、for
ループを使用してファイルを順番に開き、必要な処理を行うことです。
以下は、テキストファイルを一つずつ開いて内容を表示する例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 各ファイルを開いて内容を表示
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(f"--- {file_name} ---")
print(content)
--- file1.txt ---
内容1
--- file2.txt ---
内容2
--- example.txt ---
内容3
ファイルの内容をまとめてリストに格納する方法
複数のファイルの内容を一つのリストに格納することで、後でまとめて処理することができます。
以下は、全てのテキストファイルの内容をリストに格納する例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# ファイルの内容を格納するリスト
contents = []
# 各ファイルを開いて内容をリストに格納
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
contents.append(content)
# リストの内容を表示
for i, content in enumerate(contents):
print(f"--- file{i+1} ---")
print(content)
--- file1 ---
内容1
--- file2 ---
内容2
--- file3 ---
内容3
メモリ効率を考慮したファイルの逐次処理
大量のファイルを扱う場合、全ての内容を一度にメモリに読み込むのは非効率的です。
逐次処理を行うことで、メモリの使用量を抑えることができます。
以下は、ファイルを一行ずつ読み込んで処理する例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 各ファイルを一行ずつ処理
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
for line in file:
# 各行に対して処理を行う
print(line.strip()) # 行の前後の空白を削除して表示
内容1の行1
内容1の行2
内容2の行1
内容2の行2
内容3の行1
内容3の行2
エラーハンドリングと例外処理
ファイル操作を行う際には、エラーハンドリングを行うことが重要です。
ファイルが存在しない場合や、読み込み中にエラーが発生した場合に備えて、try
とexcept
を使用して例外処理を行います。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 各ファイルを開いて内容を表示
for file_name in file_list:
try:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(f"--- {file_name} ---")
print(content)
except FileNotFoundError:
print(f"エラー: {file_name} が見つかりません。")
except Exception as e:
print(f"エラー: {file_name} の処理中にエラーが発生しました。 {e}")
--- file1.txt ---
内容1
--- file2.txt ---
内容2
エラー: file3.txt が見つかりません。
このように、複数のファイルを一括で処理する方法にはさまざまなアプローチがあります。
ファイルを一つずつ開いて処理する方法や、内容をリストに格納する方法、メモリ効率を考慮した逐次処理、エラーハンドリングを適切に行うことで、より効率的で安全なファイル操作が可能になります。
応用例:特定のファイル形式をまとめて処理する
特定のファイル形式をまとめて処理することは、データ分析やファイル管理において非常に重要です。
ここでは、CSVファイル、JSONファイル、テキストファイル、画像ファイルをそれぞれまとめて処理する方法について解説します。
CSVファイルをまとめて読み込む方法
CSV(Comma-Separated Values)ファイルは、データをカンマで区切って保存する形式です。
Pythonでは、pandas
ライブラリを使用してCSVファイルを簡単に読み込むことができます。
import pandas as pd
import glob
# カレントディレクトリ内の全てのCSVファイルを取得
file_list = glob.glob("*.csv")
# 各CSVファイルを読み込んでデータフレームに格納
dataframes = []
for file_name in file_list:
df = pd.read_csv(file_name)
dataframes.append(df)
# 全てのデータフレームを結合
combined_df = pd.concat(dataframes, ignore_index=True)
# 結果を表示
print(combined_df)
Column1 Column2
0 1 2
1 3 4
2 5 6
...
JSONファイルをまとめて読み込む方法
JSON(JavaScript Object Notation)ファイルは、データをキーと値のペアで保存する形式です。
Pythonのjson
モジュールを使用して、JSONファイルを読み込むことができます。
import json
import glob
# カレントディレクトリ内の全てのJSONファイルを取得
file_list = glob.glob("*.json")
# 各JSONファイルを読み込んでリストに格納
data_list = []
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
data = json.load(file)
data_list.append(data)
# 結果を表示
for data in data_list:
print(data)
{'key1': 'value1', 'key2': 'value2'}
{'key1': 'value3', 'key2': 'value4'}
...
テキストファイルをまとめて読み込む方法
テキストファイルは、単純なテキストデータを保存するための一般的な形式です。
複数のテキストファイルをまとめて読み込む方法は、以下の通りです。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# ファイルの内容を格納するリスト
contents = []
# 各テキストファイルを読み込んでリストに格納
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
contents.append(content)
# 結果を表示
for i, content in enumerate(contents):
print(f"--- file{i+1} ---")
print(content)
--- file1 ---
内容1
--- file2 ---
内容2
--- file3 ---
内容3
画像ファイルをまとめて処理する方法
画像ファイルをまとめて処理する場合、PIL
(Pillow)ライブラリを使用することが一般的です。
以下は、画像ファイルを読み込んで表示する例です。
from PIL import Image
import glob
# カレントディレクトリ内の全ての画像ファイルを取得
file_list = glob.glob("*.png") # PNGファイルを対象
# 各画像ファイルを読み込んで表示
for file_name in file_list:
img = Image.open(file_name)
img.show() # 画像を表示
このコードでは、カレントディレクトリ内の全てのPNG画像を読み込み、表示します。
JPEGや他の形式の画像ファイルも同様に処理できます。
このように、特定のファイル形式をまとめて処理する方法を理解することで、データの管理や分析がより効率的に行えるようになります。
各ファイル形式に応じた適切なライブラリや手法を選択することが重要です。
応用例:ディレクトリ構造を考慮したファイルの読み込み
ディレクトリ構造を考慮したファイルの読み込みは、特に大規模なプロジェクトやデータセットを扱う際に重要です。
ここでは、サブディレクトリ内のファイルを再帰的に処理する方法、特定のディレクトリのみを対象にする方法、ファイル名に基づいて処理を分岐させる方法について解説します。
サブディレクトリ内のファイルを再帰的に処理する
Pythonのos
モジュールやpathlib
モジュールを使用して、サブディレクトリ内のファイルを再帰的に処理することができます。
以下は、os.walk()
を使用して全てのファイルを処理する例です。
import os
# カレントディレクトリ内の全てのファイルを再帰的に処理
for dirpath, dirnames, filenames in os.walk("."):
for file_name in filenames:
full_path = os.path.join(dirpath, file_name)
print(f"処理中: {full_path}")
処理中: ./file1.txt
処理中: ./folder1/file2.txt
処理中: ./folder2/file3.txt
特定のディレクトリのみを対象にする方法
特定のディレクトリ内のファイルのみを対象にする場合、os.listdir()
やpathlib.Path.iterdir()
を使用して、指定したディレクトリ内のファイルを取得することができます。
以下は、特定のディレクトリ内のファイルを処理する例です。
import os
# 特定のディレクトリを指定
target_directory = "./folder1"
# 指定したディレクトリ内の全てのファイルを処理
for file_name in os.listdir(target_directory):
full_path = os.path.join(target_directory, file_name)
print(f"処理中: {full_path}")
処理中: ./folder1/file1.txt
処理中: ./folder1/file2.txt
ファイル名に基づいて処理を分岐させる方法
ファイル名に基づいて処理を分岐させることで、特定の条件に応じた処理を行うことができます。
以下は、ファイル名に特定の文字列が含まれている場合に処理を分岐させる例です。
import os
# カレントディレクトリ内の全てのファイルを再帰的に処理
for dirpath, dirnames, filenames in os.walk("."):
for file_name in filenames:
full_path = os.path.join(dirpath, file_name)
# ファイル名に"data"が含まれている場合の処理
if "data" in file_name:
print(f"データファイルを処理中: {full_path}")
else:
print(f"通常ファイルを処理中: {full_path}")
通常ファイルを処理中: ./file1.txt
データファイルを処理中: ./folder1/data_file.txt
通常ファイルを処理中: ./folder2/file3.txt
このように、ディレクトリ構造を考慮したファイルの読み込みを行うことで、特定の条件に基づいた効率的なファイル処理が可能になります。
サブディレクトリ内のファイルを再帰的に処理したり、特定のディレクトリやファイル名に基づいて処理を分岐させることで、柔軟なデータ管理が実現できます。
応用例:ファイルの内容をフィルタリングして処理する
ファイルの内容をフィルタリングして処理することは、特定のデータを抽出したり、必要な情報を効率的に管理するために重要です。
ここでは、ファイル名に基づくフィルタリング、ファイルの内容に基づくフィルタリング、特定の条件に一致するファイルのみを処理する方法について解説します。
ファイル名に基づくフィルタリング
ファイル名に特定のパターンや文字列が含まれている場合に、そのファイルを処理する方法です。
以下は、特定の文字列を含むファイル名のみを対象にする例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# "data"を含むファイル名のみを処理
for file_name in file_list:
if "data" in file_name:
with open(file_name, 'r', encoding='utf-8') as file:
content = file.read()
print(f"処理中: {file_name}")
print(content)
処理中: data_file1.txt
内容1
ファイルの内容に基づくフィルタリング
ファイルの内容に基づいてフィルタリングを行うことで、特定の条件に合致するデータを抽出することができます。
以下は、ファイルの内容に特定のキーワードが含まれている場合に処理を行う例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# "重要"というキーワードを含む行を持つファイルを処理
for file_name in file_list:
with open(file_name, 'r', encoding='utf-8') as file:
for line in file:
if "重要" in line:
print(f"処理中: {file_name} - 行: {line.strip()}")
処理中: file1.txt - 行: これは重要な情報です。
特定の条件に一致するファイルのみを処理する方法
特定の条件に一致するファイルを処理するためには、ファイル名や内容に基づいて条件を設定し、その条件に合致するファイルのみを対象にすることができます。
以下は、ファイル名と内容の両方に基づいてフィルタリングを行う例です。
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# "data"を含むファイル名かつ"重要"というキーワードを含む行を持つファイルを処理
for file_name in file_list:
if "data" in file_name:
with open(file_name, 'r', encoding='utf-8') as file:
for line in file:
if "重要" in line:
print(f"処理中: {file_name} - 行: {line.strip()}")
処理中: data_file1.txt - 行: これは重要な情報です。
このように、ファイルの内容をフィルタリングして処理することで、必要なデータを効率的に抽出し、管理することが可能になります。
ファイル名や内容に基づくフィルタリングを適切に行うことで、データ処理の精度と効率を向上させることができます。
まとめ
この記事では、Pythonを使用して複数のファイルを効率的に読み込む方法や、特定のファイル形式を処理する技術、さらにはディレクトリ構造を考慮したファイルの読み込み方法について詳しく解説しました。
これにより、ファイル操作の幅が広がり、さまざまなデータ処理のニーズに応じたアプローチが可能になります。
今後は、実際のプロジェクトやデータ分析の場面で、これらの技術を活用して効率的なファイル処理を行ってみてください。