HOWTO · Python

Python を使用して 2つの CSV ファイルを比較し、相違点を出力する

この記事では、2つの CSV ファイルを比較し、ファイルの違いを出力するためのさまざまな方法について説明します。

このページの内容

この記事では、2つの CSV ファイルを比較するさまざまな方法について説明します。 この操作を実行する最も “Pythonic” な方法と、このタスクを簡素化するのに役立つ外部 Python モジュールを含めます。

最後に、Pandas DataFrames を使用して CSV ファイルの違いを識別する方法を含めます。

比較する必要がある 2つの CSV ファイルのタイトルは、file1.csv と file2.csv であると仮定します。 必要に応じてファイルの名前を変更できます。

また、以下に示すコード スニペットのファイル名を適切に置き換えてください。

例として、ファイルを次のように設定します。

file1.csv:

1,2,3,4,5,6
4,5,6,7,8,9
1,3,4,5,6,1

file2.csv:

1,2,3,4,5,6
4,5,6,7,8,9
2,3,1,4,1,5

方法 1: 最も Pythonic なソリューションを使用して 2つの CSV ファイルを比較する

このメソッドでは、ファイルの内容を 2つのリストに読み取り、リストの 1つを反復処理して、各行が 2 番目のリストに存在するかどうかを確認します。 論理的には、これは非常に単純なソリューションです。

Python の根底にある効率性により、この比較は一見するとかなり効率的になります。

with open("file1.csv", "r") as file1, open("file2.csv", "r") as file2:
    f1_contents = file1.readlines()
    f2_contents = file2.readlines()

for line in f1_contents:
    if line not in f2_contents:
        print(line)

for line in f2_contents:
    if line not in f1_contents:
        print(line)

上記のコード スニペットは、異なる行を端末に出力します。

このテスト ケースでは、次のような出力が得られます。

1,3,4,5,6,1

2,3,1,4,1,5

方法 2: csv-diff - 外部モジュールを使用して 2つの CSV ファイルを比較する

まず、ターミナルで次のコマンドを使用してモジュールをインストールします。

python3 -m pip install csv-diff

インストールしたら、Python スクリプトを記述する必要はありません。 次のコマンドを使用して、ターミナルでこれを直接実行できます。

csv-diff file1.csv file2.csv --key=id

このコマンドを実行すると、端末に違いが表示されます。

このテスト ケースでは、次のような出力が得られます。

1 row added, 1 row removed

1 row added

  1: 2
  2: 3
  3: 1
  4: 4
  5: 1
  6: 5

1 row removed

  1: 1
  2: 3
  3: 4
  4: 5
  5: 6
  6: 1

このモジュールを Python スクリプトの一部として使用するには、次のようなスクリプトを記述します。

from csv_diff import load_csv, compare

difference = compare(load_csv(open("file1.csv")), load_csv(open("file2.csv")))
print(difference)

この出力は次のようになります。

{'added': [{'1': '2', '2': '3', '3': '1', '4': '4', '5': '1', '6': '5'}], 'removed': [{'1': '1', '2': '3', '3': '4', '4': '5', '5': '6', '6': '1'}], 'changed': [], 'columns_added': [], 'columns_removed': []}

方法 3: Pandas DataFrames を使用して 2つの CSV ファイルを比較する

次のスクリプトは、このタスクを実行できます。

import pandas as pd
import sys
import csv


def dataframe_difference(df1: pd.DataFrame, df2: pd.DataFrame, which=None):

    comparison_df = df1.merge(df2, indicator=True, how="outer")

    if which is None:
        diff_df = comparison_df[comparison_df["_merge"] != "both"]
    else:
        diff_df = comparison_df[comparison_df["_merge"] == which]

    return diff_df


if __name__ == "__main__":
    df1 = pd.read_csv("file1.csv", header=None)
    df2 = pd.read_csv("file2.csv", header=None)

    print(dataframe_difference(df1, df2))

read_csv メソッドでは、テスト ファイルにヘッダーがないため、引数 header=None が入力されていることに注意してください。 ファイルにヘッダーがある場合は、pd.read_csv("file1.csv") を使用して読み取ることができます。ここで、file1.csv は代わりにファイルに置き換えられます。

ファイルがスクリプトと同じディレクトリにない場合は、CSV ファイルへのフル パスを指定してください。

上記の Python スクリプトは、次のような出力を生成する必要があります。

   0  1  2  3  4  5      _merge
2  1  3  4  5  6  1   left_only
3  2  3  1  4  1  5  right_only

left_only と right_only の次の行には、すべての違いが含まれています。 _merge の次の行は、インデックスのみを表します。