「Python実践100本ノックシリーズ」を読んで|どんな人におすすめなのか

【Python】フォルダ配下のコードを一括でまとめる方法 – LLMでのコード生成への活用

近年はChatGPTをはじめとした大規模言語モデル(LLM)にコードを質問・説明するケースが増えてきました。その際、複数ファイルに分散しているソースコードをひとつにまとめて提示したいという場面があります。本記事では、Pythonを使って「特定のフォルダ配下に存在する複数のファイルを再帰的に読み込み、1つのテキストファイルにまとめる」コードを紹介します。さらに、除外したいフォルダやファイルを設定できる仕組みも実装しています。これにより、LLMにコードを投げるためのファイル連結作業を効率化できます。

目次

この記事で解決できること

  • 指定したディレクトリ配下のすべてのファイルを再帰的に検索し、ファイルの内容を一括でテキストファイルに出力できる
  • 除外したいフォルダやファイルを事前に設定し、必要なファイルだけを連結できる
  • 作成したテキストをLLMへのコードリクエストに活用して、より明確な回答やリファクタリングの提案を得られる

コード概要

以下のPythonスクリプトでは、os.walk を活用して指定ディレクトリ(root_dir)配下のファイルを再帰的に走査し、それらのファイルパスファイル内容をひとつのテキストファイルにまとめています。

主なポイント

  1. excluded_dirs: 除外したいフォルダ名をリストやセットで指定します。
  2. excluded_files: 除外したいファイル名をリストやセットで指定します。
  3. os.walkdirs[:] を上書きすることで、除外フォルダをスキップしています。
  4. テキストとして読み込めないファイルを除外するため、try-except を使って読み込み時のエラーをハンドリングしています。

サンプルコード

import os

def concatenate_files(
    root_dir='.', 
    excluded_dirs=None, 
    excluded_files=None, 
    output_file='concatenated_output.txt'
):
    """
    指定したディレクトリ配下のファイルを再帰的に読み込み、
    ファイルの相対パスと内容を連結したテキストを出力用テキストファイルに書き込みます。

    Parameters:
    -----------
    root_dir : str
        走査を開始するディレクトリ(デフォルトは現在ディレクトリ'.')
    excluded_dirs : list or set
        走査から除外したいディレクトリ名のリスト/セット
    excluded_files : list or set
        走査から除外したいファイル名のリスト/セット
    output_file : str
        出力テキストファイルのパス
    """

    if excluded_dirs is None:
        excluded_dirs = []
    if excluded_files is None:
        excluded_files = []

    with open(output_file, 'w', encoding='utf-8') as out_f:
        for current_root, dirs, files in os.walk(root_dir):
            # 除外ディレクトリをスキップ
            dirs[:] = [d for d in dirs if d not in excluded_dirs]

            for filename in files:
                # 除外ファイルをスキップ
                if filename in excluded_files:
                    continue

                file_path = os.path.join(current_root, filename)

                # テキストファイルで読み込む際のエラーをハンドリング
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()

                    # ファイルパスと内容を区切って書き込み
                    out_f.write(f"=== File: {file_path} ===\n")
                    out_f.write(content)
                    out_f.write("\n\n---\n\n")
                except Exception as e:
                    print(f"Skipping file: {file_path} - {e}")

    print(f"ファイルの内容を '{output_file}' に書き出しました。")

if __name__ == '__main__':
    excluded_dirs = {'.git', 'venv', '__pycache__'}  # 除外したいディレクトリ
    excluded_files = {'.DS_Store', 'README.md'}      # 除外したいファイル
    
    concatenate_files(
        root_dir='.',
        excluded_dirs=excluded_dirs, 
        excluded_files=excluded_files, 
        output_file='concatenated_output.txt'
    )

実行手順

  1. 上記コードを .py ファイルとして保存します(例: concat_files.py)。
  2. 同じフォルダでターミナルを開き、python concat_files.py を実行します。
  3. 指定されたディレクトリ配下(ここではカレントディレクトリ)にあるファイル内容が再帰的にまとめられ、concatenated_output.txt に出力されます。

出力例

実行後、以下のようなテキストが出力ファイルにまとまります。

=== File: ./example.py ===
( example.py の中身 )

---

=== File: ./subfolder/sample.txt ===
( sample.txt の中身 )

---

... (続く)

まとめ

以上のように、Pythonの簡単なスクリプトを使うだけでディレクトリ配下のファイルを再帰的に連結し、テキストにまとめることができます。
除外フォルダやファイルの設定を行うことで、用途に合わせた最適なテキスト連結が可能です。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次