Pythonを使用して、特定のフォルダ内にある複数のファイルを結合し、1つのファイルにまとめる方法を解説します。主にテキストファイル(.txt)、CSVファイル、ログファイルなど、テキストベースのファイルを対象としますが、テキストベースであれば他の形式のファイルにも応用可能です。
前提条件
- Pythonがインストールされていること
- 対象ファイルが格納されているフォルダが存在すること
ファイル結合の基本
ファイル結合処理は、主に以下の手順で行います。
- 結合対象のファイルリストを取得
- 出力ファイルを開く
- 各入力ファイルを読み込み、出力ファイルに書き込む
この基本手順を元に、globモジュールとosモジュールを使った2つの方法を紹介します。
方法1: globモジュールを使用
globモジュールは、パターンに一致するファイル名を取得するのに便利です。
1. globモジュールの基本的な使い方
まず、特定のフォルダ内の.txtファイルを結合するシンプルなコードを示します。
import glob # 結合対象ファイルリスト取得: 'folder'内の全ての.txtファイルを取得 file_list = glob.glob("folder/*.txt") # 出力ファイルを開く: 'result.txt'に書き込みモードで開く with open("result.txt", "w") as outfile: # 各ファイルを読み込み、出力ファイルに書き込む for file_name in file_list: with open(file_name, "r") as infile: outfile.write(infile.read())
2. 拡張子の変更
CSVファイルやログファイルを結合する場合、glob.glob()に渡すパターンを変更します。
- CSVファイル:
glob.glob("folder/*.csv") - ログファイル:
glob.glob("folder/*.log")
3. サブフォルダを含めたファイル検索
特定のフォルダ内だけでなく、サブフォルダ内のファイルを結合する場合には、globのrecursiveオプションを使用します。glob.glob("folder/**/*.txt", recursive=True)のように **は任意の階層のサブフォルダを表し、recursive=Trueで再帰的な検索を有効にします。
import glob # 'folder'とそのサブフォルダ内の全ての.txtファイルを対象とする file_list = glob.glob("folder/**/*.txt", recursive=True) with open("result.txt", "w") as outfile: for file_name in file_list: with open(file_name, "r") as infile: outfile.write(infile.read())
方法2: osモジュールを使用
osモジュールは、ファイルシステムに関する操作を提供します。ファイルリストの取得にos.listdir()を使用します。
1. osモジュールの基本的な使い方
import os # 'folder'内のファイルリストを取得 file_list = os.listdir("folder") # 出力ファイルを開く with open("result.txt", "w") as outfile: # 各ファイルに対して処理 for file_name in file_list: # ファイルパスを結合 file_path = os.path.join("folder", file_name) # .txtファイルのみを処理 if file_path.endswith(".txt"): with open(file_path, "r") as infile: outfile.write(infile.read())
2. 特定の拡張子のファイルのみを対象とする
上記のコードでは.txtファイルのみを対象としていますが、.endswith()にタプルを渡すことで、複数の拡張子に対応できます。
import os # 'folder'内のファイルリストを取得 file_list = os.listdir("folder") with open("result.txt", "w") as outfile: for file_name in file_list: file_path = os.path.join("folder", file_name) # .txt と .csv ファイルを処理 if file_path.endswith((".txt", ".csv")): with open(file_path, "r") as infile: outfile.write(infile.read())
3. os.walkを使用したサブフォルダの処理
os.walkを使用するとより簡潔にサブフォルダを含めたファイルの処理ができます。例えば、os.walk("folder")のように記載して"folder"から順に、ルートディレクトリ(root)、サブディレクトリのリスト(dirs)、ファイル名のリスト(files)を返します。
import os with open("result.txt", "w") as outfile: for root, dirs, files in os.walk("folder"): for file_name in files: if file_name.endswith(".txt"): file_path = os.path.join(root, file_name) with open(file_path, "r") as infile: outfile.write(infile.read())
比較表: globとos
| 機能 | globモジュール |
osモジュール |
|---|---|---|
| ファイル一覧取得 | パターンマッチング (*.txt, *.csvなど) |
os.listdir() (全ファイル), os.walk() (再帰的) |
| サブフォルダ対応 | recursive=True オプション |
os.walk() |
| 簡潔さ | 特定の拡張子のファイル取得に特化 | より汎用的、ファイル操作全般に利用可能 |
| 柔軟性 | パターンによる柔軟なファイル選択が可能 | ファイル名、拡張子による条件分岐が必要 |
まとめ
Pythonでのファイル結合は、globモジュールやosモジュールを使うことで効率的に行えます。ログファイルやCSVファイルなど、形式が統一された複数のファイルを結合して分析やデータ処理を行う前処理として有用です。
どちらのモジュールを使用するかは、状況に応じて使い分けます。単純なファイル結合ではglob、サブフォルダを含む再帰的な処理や、より複雑な条件分岐が必要な場合osを利用します。
今回はテキストベースのファイルの結合について解説しましたが、PDFファイルの結合も可能です。PythonでのPDFファイルの結合については下記のページで解説しています。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]