Pythonで差分ファイルを生成する方法:ユニファイドDiffの活用

今回は、Pythonを使って2つのテキストファイルの差分を生成し、その結果をユニファイドDiff形式で出力する方法をご紹介します。この技術は、コードの変更履歴管理やテキスト比較に非常に役立ちます。

ユニファイドDiffとは

ユニファイドDiffは、テキストファイルの差分を表示するための標準的な形式です。この形式は、変更された行とその周辺のコンテキストを一緒に表示するため、変更内容を理解しやすくなっています。ユニファイドDiffの主な特徴は以下の通りです:

  • 変更されたファイルの名前を表示
  • 変更された行の周辺のコンテキストを含む
  • 追加された行は「+」、削除された行は「-」で表示
  • 変更のない行はそのまま表示

Pythonでの実装

それでは、Pythonを使って差分ファイルを生成する方法を見ていきましょう。

必要なモジュール

import difflib

Pythonの標準ライブラリであるdifflibモジュールを使用します。このモジュールは、シーケンス(文字列やリストなど)の差分を計算するための様々なツールを提供しています。

プログラムの実装

import difflib

def main():
# ファイルを読み込む
with open('はれ.txt', 'r', encoding='utf-8') as file1:
sunny_lines = file1.readlines()

with open('あめ.txt', 'r', encoding='utf-8') as file2:
rainy_lines = file2.readlines()

# ユニファイドdiffを生成
diff = difflib.unified_diff(sunny_lines, rainy_lines, fromfile='はれ.txt', tofile='あめ.txt')

# 差分をweather.diffファイルに書き込む
with open('weather.diff', 'w', encoding='utf-8') as f_diff:
f_diff.writelines(diff)

if __name__ == "__main__":
main()

このプログラムでは、以下の手順を実行しています:

  1. if __name__ == "__main__": を使用して、スクリプトが直接実行された場合にのみmain()関数を呼び出すようにしています。リプトが直接実行された場合にのみmain()関数を呼び出すようにしています。
  2. 2つのテキストファイル(はれ.txtあめ.txt)を読み込みます。
  3. difflib.unified_diff()関数を使用して、ユニファイドDiffを生成します。
  4. 生成された差分をweather.diffファイルに書き込みます。

入力ファイルと出力結果

入力ファイル

はれ.txtの内容:

textこんにちは。にいやんです。
今日は晴れです。
お疲れ様でした。

あめ.txtの内容:

textこんにちは。にいやんです。
今日は雨です。
お疲れ様でした。

出力ファイル

生成されたweather.diffの内容:

text--- はれ.txt
+++ あめ.txt
@@ -1,3 +1,3 @@
こんにちは。にいやんです。
-今日は晴れです。
+今日は雨です。
お疲れ様でした。

ユニファイドDiffの解説

生成されたユニファイドDiffを詳しく見てみましょう:

  1. --- はれ.txt+++ あめ.txtは、比較対象のファイル名を示しています。
  2. @@ -1,3 +1,3 @@は、変更箇所の位置情報です。この場合、両ファイルの1行目から3行を表示していることを意味します。
  3. 変更のない行はそのまま表示されます。
  4. -今日は晴れです。は、元のファイルから削除された行を示しています。
  5. +今日は雨です。は、新しいファイルに追加された行を示しています。

まとめ

Pythonのdifflibモジュールを使用することで、簡単にユニファイドDiff形式の差分ファイルを生成できることがわかりました。この技術は、バージョン管理システムやテキスト比較ツールの基礎となる重要な概念です。ユニファイドDiffを理解し、活用することで、コードの変更履歴を効率的に管理したり、ドキュメントの異なるバージョン間の違いを簡単に把握したりすることができます。

WinMergeで簡単に差分ファイルを生成したい方はこちら

差分をマージする方法はこちら

この記事が、あなたの役に立てば幸いです!

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村