Python を使用して 2つの CSV ファイルを比較し、相違点を出力する
- 方法 1: 最も Pythonic なソリューションを使用して 2つの CSV ファイルを比較する
-
方法 2:
csv-diff
- 外部モジュールを使用して 2つの CSV ファイルを比較する - 方法 3: Pandas DataFrames を使用して 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
の次の行は、インデックスのみを表します。