【Python】diffを使ってテキストやファイルを比較する方法を初心者向けに解説

はじめに

皆さんは、プログラムのコードやテキストファイルに対して「どこが変更されたのか」を確認したいと感じたことはないでしょうか。

特に開発現場では、複数の人が同じファイルを編集する機会が多いです。 小さな変更を見落とさないために、変更部分を素早く見つける手段があると便利です。

そこで役立つのがPython diffというアプローチです。 Pythonには、テキストやファイルの差分を取得するための仕組みがいくつか用意されています。 本記事では、その代表的な方法であるdifflibモジュールを中心に、具体例とともに解説します。

この記事を読むとわかること

  • Python diffの基本的な考え方
  • difflibモジュールを使ったテキスト比較の方法
  • ファイル同士の比較に役立つアプローチ
  • 実務で意識したい差分管理のポイント

ここで紹介する内容は、初心者の方でも理解しやすいように整理しています。 身近なシーンでの活用イメージを持って学習を進めてみてください。

Python diffとは?

Python diffとは、テキストやファイルなどの変更点を比較し、差分を抽出する手法の総称です。 Pythonにはさまざまな標準ライブラリが存在し、その中でもdifflibというモジュールは単純な文字列の比較からファイル同士の比較まで対応しています。

このような差分比較は、ソースコードの修正箇所を確かめたり、設定ファイルの変更点を調べたりするときに非常に便利です。 作業の効率化に大きく貢献してくれるので、プログラミング初心者の方にもおすすめしたい方法です。

difflibモジュールの概要

difflibは、Pythonの標準ライブラリのひとつです。 文字列同士の差分を行単位や単語単位で比較し、どの部分が追加されたか、あるいは削除されたかをわかりやすい形で出力してくれます。

代表的な関数としては以下のものがあります。

unified_diff(...)

ユニファイド形式の差分を生成する

context_diff(...)

コンテキスト形式の差分を生成する

HtmlDiff(...)

差分をHTML形式で出力する

これらを利用すると、テキスト同士を並べて比較した結果をさまざまな形式で閲覧できます。 開発者の皆さんは、状況に応じて使い分けることが多いです。

使用例:テキスト同士の比較

ここでは、単純なテキストの差分をunified_diff関数で比較する例を見てみましょう。

import difflib

text1 = """Python is a powerful language.
It is used for web development.
It has a simple syntax."""

text2 = """Python is a versatile language.
It is used for web development.
It has a clear syntax and many libraries."""

# テキストを行単位で分割
lines1 = text1.splitlines()
lines2 = text2.splitlines()

diff_result = difflib.unified_diff(lines1, lines2, fromfile='text1', tofile='text2')

for line in diff_result:
    print(line)

上記のコードでは、text1text2の内容がどのように変更されているかを、行単位で比較しています。 unified_diffは、追加された行や削除された行を示すフォーマットで結果を出力します。

実務でも、ログメッセージの差分を確認したり、ドキュメントに書かれた文章がどこで変わったかを把握したりする際に応用できます。

使用例:ファイル同士の比較

次に、ファイル同士の差分を確認する方法を見てみましょう。 テキスト比較の応用ですが、ファイル読み込み部分を差し替えるだけで対応可能です。

import difflib

# 比較対象のファイルパス
file1 = "old_version.py"
file2 = "new_version.py"

with open(file1, 'r', encoding='utf-8') as f1:
    lines1 = f1.readlines()

with open(file2, 'r', encoding='utf-8') as f2:
    lines2 = f2.readlines()

diff = difflib.unified_diff(
    lines1,
    lines2,
    fromfile=file1,
    tofile=file2
)

for line in diff:
    print(line.strip())

readlines()でファイル全体を行単位で取得し、unified_diffにわたしています。 Pythonのコードに限らず、テキストファイルであれば任意の内容を比較できます。

ファイル比較は、後述の「実務での活用シーン」でも紹介するように、バージョン管理や定期的な変更内容のチェックに役立ちます。

Pythonでのdiff活用シーン

Python diffの活用例として、多くの人が思い浮かべるのはソースコード管理ですが、実はさまざまな場面で有用です。 ここでは、特に代表的なシーンをいくつかピックアップしてみます。

ソースコードの差分管理

複数人が同じプロジェクトに参加している場合、誰がどのような修正を行ったのかを把握するのは重要です。 こうした変更管理にはGitなどのバージョン管理システムがよく使われますが、あえてPython上で独自に比較をすることもあります。

たとえば、下記のようなケースが考えられます。

  • コンパクトなツールを作り、一括で差分を確認したい
  • ちょっとしたスクリプトとして自動化したい
  • OS環境によっては標準のdiffコマンドが使いにくい

実務では、外部の比較ツールやバージョン管理システムと組み合わせることが多いです。 ただ、Pythonの知識を活かして自分好みのdiffツールを作ってみるのも面白いでしょう。

ログファイルの差分解析

システムが出力するログファイルや、定期的に更新されるデータファイルの差分チェックにもPython diffは活用しやすいです。 たとえば、以下のような使い方がイメージできます。

  • 前日と本日のログを比較して異なる行を調べる
  • エラーが増えたかどうかをテキストマッチングで確認する
  • 数値データの変化量を把握する

ログファイルはサイズが大きくなりやすいので、メモリ消費や処理時間には気を配る必要があります。 しかし、差分を効率よくとることで、その日の変更点だけをすばやく見つけることができるのは便利です。

より多彩な比較:その他の方法

先ほどはdifflib.unified_diffcontext_diffなど、テキスト比較に向いた関数を中心に紹介しました。 実際には、他にもさまざまな手段がありますので、用途に合わせて試してみてください。

filecmpモジュール

filecmpモジュールは、ファイルやディレクトリ全体の比較を行いたい場合に向いています。 中身のハッシュ値やメタデータを比較する仕組みを備えており、次のような特徴があります。

  • ファイル名やサイズだけでなく、内容そのものも比較できる
  • ディレクトリ内のファイルを一括で比較できる
  • 同一ファイルがどれかを調べるのに適している

シンプルな例として、ディレクトリ内にあるファイルの差分を確認する方法を示します。

import filecmp

dir1 = "old_project"
dir2 = "new_project"

comparison = filecmp.dircmp(dir1, dir2)

print("左右で同じファイル:", comparison.common_files)
print("左にのみ存在するファイル:", comparison.left_only)
print("右にのみ存在するファイル:", comparison.right_only)

ここでは差分を行単位で詳しく見るのではなく、「どのファイルが増えたor減ったか」などを一目で把握できます。 大規模なフォルダ構成を扱うときや、ファイルそのものの比較が主目的のときに使われることが多いです。

HtmlDiffで視覚的な差分表示

テキストの比較結果をわかりやすく視覚化したい場合には、difflib.HtmlDiffが役立ちます。 HTMLのテーブル形式で差分を示してくれるため、ブラウザ上で見やすいレイアウトを実現できます。

サンプルコードは以下のようになります。

import difflib

text1 = """Line1: Hello
Line2: This is Python
Line3: Let's learn diff!
"""

text2 = """Line1: Hello
Line2: This is Python 3
Line3: Let's learn diff now!
Line4: Additional line
"""

differ = difflib.HtmlDiff()
html_result = differ.make_file(text1.splitlines(), text2.splitlines())

with open("diff_result.html", "w", encoding="utf-8") as f:
    f.write(html_result)

これによって生成されるdiff_result.htmlをブラウザで開くと、左右にテキストが並んだ表が表示され、それぞれの差分がハイライトされます。 独自のツールやドキュメント作成に組み込みたい場合にも応用しやすいでしょう。

実務で意識したいポイント

いざ実務でPython diffを使おうとすると、単純に差分をとるだけでは済まないケースもあります。 ここでは、具体的にどのような点に注意すればよいかをいくつか挙げてみます。

ファイルサイズが大きい場合の注意点

ログファイルなど、内容が非常に大きいファイルを扱うときには次の点に気をつけましょう。

  • メモリの消費量が増えやすい
  • 差分処理に時間がかかる場合がある

一度にファイル全体を読み込むのではなく、行単位やチャンク単位で読み込んで部分的に差分をとる工夫も考えられます。 このように、比較対象の規模にあわせた処理フローにすることで、Python diffの利便性を保ったままパフォーマンスを向上できます。

大きなファイルの処理をスクリプトで一括実行する場合は、途中でメモリ不足にならないよう注意が必要です。必要に応じてファイル分割やバッファリングを検討すると良いでしょう。

差分の精度を高める方法

テキスト比較の結果が多すぎたり、余計な空白の差異まで表示されたりすると、肝心の変更点が見えにくくなります。 そんなときは、以下のような対策が考えられます。

  • 空白や改行のみの変更を除外する
  • 正規表現などを用いて、一部パターンをあらかじめ整形する
  • 主要部分だけを比較し、コメント行などは無視する

こうした前処理を行うことで、ノイズを減らしながら必要な差分だけにフォーカスできます。 たとえば、difflibが提供するIS_LINE_JUNKなどのカスタマイズ機能を活用する方法もあります。 実務環境の要件に合わせて工夫してみてください。

まとめ

Python diffを活用すると、テキストやファイルの変更点を効率的に比較できます。 標準ライブラリのdifflibfilecmpモジュールは、初心者にも使いやすい構造となっており、基本的な理解さえあれば幅広い場面で応用できます。

  • テキストの比較ではunified_diffなどが便利
  • ファイル同士の比較も同じ手順で実行できる
  • ディレクトリ全体を対象とする場合はfilecmpが有効
  • 大規模データや不要な差分が多い場合には工夫した前処理が重要

これらのポイントを押さえておけば、プロジェクトのバージョン管理やログ解析などで活用の幅が広がるはずです。 皆さんもぜひPython diffを試してみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。