compare_file_diff.py ドキュメント

概要

compare_file_diff.py は、2つのテキストファイルを比較し、変更のあった行とその周辺のコンテキスト行のみを抽出してコンパクトな差分を出力するコマンドラインツールです。

背景・目的

標準的な unified diff 形式から不要なメタデータ( --- や +++ 、 @@ など)を取り除き、実際のテキスト変更箇所のみを簡潔に確認することを目的としています。テキストファイルのエンコーディングを自動的に判定し、改行コード(CRLFとLF)の違いを吸収するため、OS環境の差異に起因する不要な差分出力を抑制します。

動作原理・処理フロー

  1. 引数とファイルの確認 コマンドライン引数として渡された old_file と new_file のパスを解決し、ファイルが実際に存在するか検証します。

  2. テキストの読み込みとエンコーディング判定 utf-8-sig 、 utf-8 、 cp932 の順にデコードを試みます。すべて失敗した場合は、エラー箇所を置換文字に置き換えつつ utf-8 で強制的に読み込みます。この際、改行コードは自動的に正規化されます。

  3. 差分の生成 標準ライブラリの difflib.unified_diff を用いて差分情報を計算します。

  4. 出力の整形 unified diff の出力からファイルヘッダや行番号情報を取り除き、実際の追加行( + )、削除行( - )、および変更のないコンテキスト行のみを抽出します。また、互いに離れた変更箇所の間には区切り文字として ... を挿入します。

  5. 結果の出力 比較した各ファイルのパスと自動判定されたエンコーディング情報を出力した後、整形された差分テキストを標準出力に表示します。

入出力仕様

入力

  • 第1位置引数 ( old_file )

    • 比較元となる古いテキストファイルのパス。

  • 第2位置引数 ( new_file )

    • 比較先となる新しいテキストファイルのパス。

  • オプション引数 ( --context または -c )

    • 変更箇所の前後に表示する変更のない行(コンテキスト行)の数を指定します。

    • デフォルト値は 2 です。負の値を指定した場合は 0 として扱われます。

出力

  • 標準出力の冒頭に変更前後のファイルパス、エンコーディング情報、および適用されたコンテキスト行数が表示されます。

  • その後、 --- の区切り線に続き、整形済みの差分テキストが表示されます。

  • 差分が一切存在しない場合は (no text difference found) と出力されます。

実行例

基本的な比較を行う場合の実行例です。

python compare_file_diff.py old.py new.py

コンテキスト行数を 3 に変更して実行する例です。

python compare_file_diff.py old.py new.py --context 3

短縮オプション -c を使用し、変更行のみ(コンテキスト行なし)を出力する例です。

python compare_file_diff.py old.txt new.txt -c 0