Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つのファイルの差分(diff)を検出する方法

Pythonの標準ライブラリには、文字列やファイル間の差分を検出するための専用モジュール difflib が用意されています。このモジュールの unified_diff 関数を使えば、Unixのdiffコマンドのような「統一形式(unified format)」の差分を、追加のインストールなしに簡単に取得できます。

サンプルファイルの準備

例として、次のような内容を持つ2つのファイル file1file2 を用意します。

file1:
Hello
People
of
the
world

file2:
Hello
People
from
India

差分を検出するコード

これらのファイルの差分を取得するには、以下のように記述します。ポイントは、read() の後に splitlines() を呼び出して、テキストを行のリストに変換してから渡すことです。unified_diff は行単位で比較を行うため、この変換が必要になります。

import difflib

with open('file1') as f1:
    f1_text = f1.read().splitlines()
with open('file2') as f2:
    f2_text = f2.read().splitlines()

# 差分を検出して表示する
for line in difflib.unified_diff(f1_text, f2_text,
                                  fromfile='file1',
                                  tofile='file2',
                                  lineterm=''):
    print(line)

実行結果

上記のコードを実行すると、次のような出力が得られます。

--- file1
+++ file2
@@ -1,5 +1,4 @@
 Hello
 People
-of
-the
-world
+from
+India

出力の読み方

各行の先頭にある記号には、それぞれ次のような意味があります。

  • --- / +++: 比較元と比較先のファイル名を示すヘッダー
  • @@ ... @@: 変更が発生した位置(開始行番号と行数)
  • 先頭が半角スペースの行: 両ファイルで共通している行
  • - で始まる行: file1 から削除された行
  • + で始まる行: file2 に追加された行

補足: その他の便利な機能

difflib には他にも便利な関数が用意されています。context_diff() を使うとコンテキスト形式の差分が取得でき、ndiff() を使うとより詳細な行単位の比較結果が得られます。また、HtmlDiff() クラスを使えば、差分を色分けしたHTMLテーブルとして出力することも可能です。用途に応じて使い分けるとよいでしょう。

  1. Pythonで二分木のノードとその子孫の最大絶対差を求めるプログラム

    問題概要 二分木が与えられたとき、任意のノードとその子孫との間の絶対差の最大値を求めることを考えます。 例えば、次のような二分木が入力として与えられた場合を考えてみましょう。 この場合、ノード8とノード1の間の差が最も大きくなるため、出力は 7 となります。 解法のアプローチ:DFSを使った追跡 この問題は、DFS(深さ優先探索)を用いることで効率的に解けます。各ノードについて「その部分木内の最小値」と「最大値」を追跡しながら、現在のノードの値との差を順次更新していくのがポイントです。 具体的な手順は以下の通りです。 dfs() 関数を定義します。引数としてノードを受け取ります。 ノード

  2. Pythonでリスト内のすべてのペア間の絶対差の合計を求めるプログラム

    本記事では、リスト内のすべてのペア間の絶対差の合計を求める問題の解法とアプローチについて解説します。 問題文 リストが入力として与えられたとき、そのリスト内のすべてのペア間の絶対差の合計を求める必要があります。 解法のアプローチ enumerate() メソッドは、イテラブル(反復可能オブジェクト)にカウンターを付加し、enumerate オブジェクトとして返す組み込み関数です。ループ処理の中でインデックスと要素を同時に取得したい場合に非常に便利です。 この手法では、まず絶対差を格納するためのリスト「diffs」を用意します。 次に、2つの変数を持つ二重ループを使用します。片方はカウンター(イ