AIと機械学習が急速に進化する世界では、ChatGPTのようなモデルの能力をパーソナライズし、拡張する力がますます重要になっています。有用なアプローチのひとつは、特定のドメイン、プロジェクト、またはコードベースについてモデルが質問に答える助けとなる、カスタマイズされた知識ベースを用意することです。
そのためには、Pythonコードのリポジトリを読みやすいテキスト形式に変換する実用的な方法が必要です。以下のガイドでは、ディレクトリ内のPythonファイルを、確認、アーカイブ、またはカスタム知識ベースの一部としてアップロードできるテキストファイルへ結合する方法を示します。
背景
価値あるコード、コメント、プロジェクト固有の文脈を含むPythonスクリプトでいっぱいのリポジトリがあるとします。元のリポジトリの外でも内容を読みやすくしながら、その構造を保ちたいと考えています。
課題は、ソースファイルのパスを失わずにコードベースをプレーンテキストへ変換することです。元のパスを保持することは重要です。各スニペットがプロジェクト内のどこにあったのかを追跡できるからです。
解決策
以下のスクリプトは、ソースディレクトリを走査し、Pythonファイルを見つけ、各ディレクトリ内のファイルを対応する .txt ファイルに結合します。出力内の各セクションは、元のファイルパスで始まり、その後にファイル内容が続きます。
これにより、確認しやすく、プロジェクトが大きい場合にもディレクトリ単位で分割しやすい、シンプルなエクスポート形式が得られます。
仕組み
- ディレクトリを走査する: スクリプトは
os.walkを使って指定されたソースディレクトリ内を移動し、.py拡張子を持つPythonファイルを識別します。 - ファイルを結合する: 各サブディレクトリで見つかったすべてのPythonファイルを、ひとつのテキストファイルにまとめます。参照用に、各元ファイルのパスも含めます。
- 出力を整理する: 結合されたファイルは、ソースディレクトリ内での相対パスに基づいて命名されます。これにより、出力の構造が保たれ、理解しやすくなります。
- 柔軟性を保つ: 任意のソースディレクトリとターゲットディレクトリを指定できるため、異なるプロジェクトでも再利用できます。
コード
import os
def merge_py_files_by_directory(source_directory, target_directory):
for subdir, dirs, files in os.walk(source_directory):
py_files = [f for f in files if f.endswith('.py')]
if py_files:
relative_path = os.path.relpath(subdir, start=source_directory)
new_filename = relative_path.replace(os.sep, '_') + '.txt'
target_file_path = os.path.join(target_directory, new_filename)
os.makedirs(target_directory, exist_ok=True)
with open(target_file_path, "w") as outfile:
for file in py_files:
file_path = os.path.join(subdir, file)
outfile.write(f"{'=' * 20}n")
outfile.write(f"File: {file_path}n")
outfile.write(f"{'=' * 20}nn")
with open(file_path, "r") as infile:
outfile.write(infile.read())
outfile.write("nn")
# Example usage
source_directory = 'diffraction'
target_directory = 'merged_py_files'
merge_py_files_by_directory(source_directory, target_directory)
いくつかの実用的な確認事項
出力を知識ソースとして使う前に、いくつか簡単に確認しておく価値があります。
source_directoryが、実際にエクスポートしたいプロジェクトフォルダを指していることを確認する。- 生成された
.txtファイルが後で誤って再処理されないよう、target_directoryがソースツリーの外にあることを確認する。 - 生成されたファイルを1つか2つ開き、ファイルパスとコードブロックが読みやすいことを確認する。
- リポジトリにシークレット、認証情報、APIキー、または非公開設定が含まれている場合は、テキストをどこかへアップロードする前に削除する。
大きなプロジェクトでは、仮想環境、キャッシュ、ビルド出力、依存関係ディレクトリをスキップしたい場合もあります。このスクリプトは、.venv、__pycache__、build、dist などのフォルダを対象外にする無視リストで拡張できます。
結論
このアプローチは、Pythonコードリポジトリを、レビューやカスタム知識ベースでの利用に適したプレーンテキスト形式へ変換するための効率的な方法を提供します。ファイルパスを保持し、ディレクトリごとにファイルをグループ化することで、エクスポートされたテキストは、区別のない巨大なダンプひとつよりもたどりやすくなります。
小規模から中規模のプロジェクトでは、このシンプルなスクリプトで十分なことが多いです。より大きなリポジトリや機密性の高いリポジトリでは、生成されたファイルを使用する前に、フィルタリング、エンコーディング処理、シークレットチェックを追加してください。
