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

この記事は約4分で読めます。
スポンサーリンク

今回は、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で簡単に差分ファイルを生成したい方はこちら

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

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

コメント

タイトルとURLをコピーしました