【Python】標準のdifflibでテキストファイルの差分比較を簡単に実行する

テキストのどの部分が更新されているんだろう?ということありますよね。
文字数が多いと、何が何だかとなります。
そんなときに役に立つのがdiffツールです。
今回はpythonテキストファイルの差分比較を簡単に行う方法をご紹介したいと思います。
python標準のdifflibライブラリを使います。

やること
・テキストファイルの読み込み
・差分を計算
・違っている箇所の表示

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

目次

やること

差分計算にdifflibライブラリを使います。
python標準でインストールされています。
特別のインストールの必要はありません。

今回はdiffの対象として2つのテキストファイルを対象にします。
テキストサンプルに、下記のニュース記事を引用しました。

NHKニュース
台風15号 非常に強い勢力 13日ごろ小笠原諸島に近づく見込み | NHK 【NHK】大型で非常に強い台風15号は、日本のはるか南の海上を北へ進んでいて、このあとも発達しながら北上し、13日ごろにかけて小笠…

textA.txtにはニュース記事そのままを。
textB.txtには、わざと一部を改変して差分箇所を作っておきました。

差分箇所は次のように設定しています。

6行目:
(正)気象庁によりますと、大型で非常に強い台風15号は~
(誤)気象庁によりますと、大型で非常に強い台風14号は~
12行目:
(正)気象庁は高波に警戒するとともに~
(誤)環境省は高波に警戒するとともに~

差分箇所を見つけられれば、うまくいったことになります。

テキストファイルの読み込み

テキストファイルの読み込みは、よくやるやつですね。
特にライブラリは必要ありません。

# 2つのテキストファイルを読み込む
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.readlines()
    text2 = file2.readlines()

私の環境のpyhtonだと、標準でutf-8エンコードで読み書きします。
稀に違うエンコードも使うことがあるようなので、明示的にutf-8エンコードを指定しています。
textA.txtの中身をtext1というテキストデータにしています。

差分を計算

今回のポイントその1です。
記述としては大変短いです。

import difflib

# difflibモジュールを使用して差分を計算
differ = difflib.Differ()
diff = list(differ.compare(text1, text2))

先ほど取り込んだ2つのテキストデータを差分比較しています。
text1text2を対象にしています。
これだけだと、どこがどう違う?が分かりません。
次は表示してみたいと思います。

違っている箇所の表示

そのまま差分結果を表示すると分かりづらいです。
今回のポイントその2です。
こんな感じになります。

そこで、何行目で違っていた、を表示したいと思います。

# 差分の行と元の行番号を表示
line_number1 = 0
line_number2 = 0
print(f"1stファイル:{fl1}")
print(f"2ndファイル:{fl2}")
for line in diff:
    if line.startswith('- '):#1stファイル
        line_number1 += 1
        print(f"1stファイル, 行{line_number1}: {line[2:]}")
    elif line.startswith('+ '):#2ndファイル
        line_number2 += 1
        print(f"2ndファイル, 行{line_number2}: {line[2:]}")
    elif line.startswith('  '):
        line_number1 += 1
        line_number2 += 1

結果がこちらです。
何行目で1stファイルではこう。2ndファイルではこうなっている、を表示しています。

無事、差分箇所を見つけることができました。

もっとクリティカルに変更箇所を表示出来たらいいのですが。
これでも、同じ文を並べて要るので、元よりもかなり差分が分かりやすくなったのではないでしょうか。

サンプルコード

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

import difflib

# 2つのテキストファイルを読み込む
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.readlines()
    text2 = file2.readlines()

# difflibモジュールを使用して差分を計算
differ = difflib.Differ()
diff = list(differ.compare(text1, text2))

# 差分の行と元の行番号を表示
line_number1 = 0
line_number2 = 0
print(f"1stファイル:{fl1}")
print(f"2ndファイル:{fl2}")
for line in diff:
    if line.startswith('- '):#1stファイル
        line_number1 += 1
        print(f"1stファイル, 行{line_number1}: {line[2:]}")
    elif line.startswith('+ '):#2ndファイル
        line_number2 += 1
        print(f"2ndファイル, 行{line_number2}: {line[2:]}")
    elif line.startswith('  '):
        line_number1 += 1
        line_number2 += 1

結果は先ほどの紹介のとおりです。

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

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