【Python】テキストファイルを差分計算(diff)して視覚的に比較表示する

何度も文章を編集していくとどこを直したのか分かりづらくなることがありますよね。
プログラムのソースコードでも、何百何千あるいは何万行もある中でどこが変わってるんだっけ?というシーンがあります。他の人が編集した場合は特にそうなります。
そんな時に役に立つのがdiffツールです。
Pythonで2つのテキスト差分計算して比較表示する方法をご紹介します。
こんな感じで視覚的に比較表示できちゃいます。

やること
・import diff_match_patchライブラリのインストール
・テキストファイルを読み込んでテキストデータにする
・差分計算
・比較結果をhtml出力
・比較表示

それでは順に見ていきましょう!

目次

やること

以前、python標準の差分計算ライブラリdifflibを使ったdiffプログラムをご紹介しました。
もう少し視覚的に見えやすくできたら、というところを解決してくれるのがdiff_match_patchライブラリです。
ご紹介していきます

今回は比較用に次のニュースを引用させていただきました。

https://xn--www3-uu5f516c7h8e.nhk.or.jp/news/html/20231012/k10014223341000.html

2つのテキストファイルを用意し、片方にはデモ用に次の箇所に間違いを仕込んでいます。

1行目
(誤)藤井七冠~
(正)藤井八冠~
10行目
(誤)ところが永瀬九段は122手目に、「勝ち筋」の「4二金」という手ではなく、「5四馬」という意外な手を指しました。
(正)ところが永瀬九段は123手目に、「勝ち筋」の「4二金」という手ではなく、「5三馬」という意外な手を指しました。

import diff_match_patchライブラリのインストール

diff_match_patchはGoogleのNeil Fraserによって作成されたオープンソースのライブラリです。このライブラリは、テキストの比較と差分の計算を支援するものです。
テキスト文書の異なるバージョン間での差分を計算し、変更点を特定することができます。
バージョン管理、コード比較、文書編集、コラボレーションツールなど、さまざまな用途で利用されます。
プログラムコードの差分比較にも広く使用され、ソフトウェア開発者にとって非常に便利です。

pipコマンドでインストールできます。

pip install diff_match_patch

テキストファイルを読み込んでテキストデータにする

今回はテキスト比較をやっていきます。
先ほど準備したテキストファイルを読み込んでおきます。

fl1 = "textA.txt" #変更前
fl2 = "textB.txt" #変更後
with open(fl1, 'r', encoding='utf-8') as file1, open(fl2, 'r', encoding='utf-8') as file2:
    text1 = file1.read()
    text2 = file2.read()

textA.txtは変更前、textB.txt変更後のテキストになっています。
テキストデータにしておき、差分計算に使います。

差分計算

今回のポイントです。
インストールしたライブラリを使ってテキスト比較をします。

import diff_match_patch

# diff_match_patchオブジェクトを作成
dmp = diff_match_patch.diff_match_patch()

# テキストを比較して差分を計算
diffs = dmp.diff_main(text1, text2) # text1が変更前。text2が変更後。
dmp.diff_cleanupSemantic(diffs)

比較結果をhtml出力

このままでは比較結果を見ることができません。
視覚的に比較表示するために、html出力します。
先ほど作ったdiff_match_patchオブジェクトを使ってhtmlファイルにします。

import diff_match_patch

# 差分をHTMLで表示
html = dmp.diff_prettyHtml(diffs)
with open("diff_output.html", "w", encoding="utf-8") as html_file:
    html_file.write(html)

比較表示

最後に作成したhtmlファイルを開いて表示します。

import webbrowser

# デフォルトのウェブブラウザでHTMLファイルを開く
webbrowser.open("diff_output.html")

実行結果が冒頭にご紹介したものです。
再掲します。

サンプルコード

ここまで紹介したコードを合体したものがこちらです。

import diff_match_patch
import webbrowser

fl1 = "textA.txt"
fl2 = "textB.txt"
with open(fl1, 'r', encoding='utf-8') as file1, open(fl2, 'r', encoding='utf-8') as file2:
    text1 = file1.read()
    text2 = file2.read()

# diff_match_patchオブジェクトを作成
dmp = diff_match_patch.diff_match_patch()

# テキストを比較して差分を計算
diffs = dmp.diff_main(text1, text2) # 引数順に意味あり。text1が基準。text2が変更後。
dmp.diff_cleanupSemantic(diffs)

# 差分をHTMLで表示
html = dmp.diff_prettyHtml(diffs)
with open("diff_output.html", "w", encoding="utf-8") as html_file:
    html_file.write(html)

# デフォルトのウェブブラウザでHTMLファイルを開く
webbrowser.open("diff_output.html")

今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!

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