Vergleichen Sie zwei CSV-Dateien und drucken Sie Unterschiede mit Python
- Methode 1: Vergleichen Sie zwei CSV-Dateien mit der pythonischsten Lösung
-
Methode 2: Vergleichen Sie zwei CSV-Dateien mit
csv-diff
- einem externen Modul - Methode 3: Vergleichen Sie zwei CSV-Dateien mit Pandas DataFrames
In diesem Artikel werden verschiedene Methoden zum Vergleichen zweier CSV-Dateien erläutert. Wir werden die pythonischste
Methode zum Ausführen dieser Operation und ein externes Python-Modul einbeziehen, das diese Aufgabe vereinfachen kann.
Schließlich werden wir eine Methode mit Pandas DataFrames einschließen, um Unterschiede in den CSV-Dateien zu identifizieren.
Wir gehen davon aus, dass die beiden CSV-Dateien, die wir vergleichen müssen, die Titel Datei1.csv
und Datei2.csv
tragen. Sie können die Dateien nach Belieben umbenennen.
Bitte ersetzen Sie auch die Dateinamen in den unten angegebenen Codeschnipseln entsprechend.
Zum Beispiel haben wir unsere Dateien wie folgt eingerichtet:
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
Methode 1: Vergleichen Sie zwei CSV-Dateien mit der pythonischsten Lösung
Bei dieser Methode lesen wir den Inhalt der Datei in zwei Listen ein, iterieren über eine der Listen und prüfen, ob jede der Zeilen in der zweiten Liste vorhanden ist oder nicht. Logischerweise ist dies eine sehr einfache Lösung.
Die zugrunde liegende Effizienz von Python macht diesen Vergleich ziemlich effizient, ungeachtet dessen, wie es aussieht.
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)
Das obige Code-Snippet gibt die unterschiedlichen Zeilen an Ihr Terminal aus.
In unserem Testfall erhalten wir als Ausgabe Folgendes.
1,3,4,5,6,1
2,3,1,4,1,5
Methode 2: Vergleichen Sie zwei CSV-Dateien mit csv-diff
- einem externen Modul
Installieren Sie zunächst das Modul mit dem folgenden Befehl in Ihrem Terminal.
python3 -m pip install csv-diff
Nach der Installation müssen Sie kein Python-Skript schreiben. Sie können dies mit dem folgenden Befehl direkt im Terminal ausführen.
csv-diff file1.csv file2.csv --key=id
Wenn Sie diesen Befehl ausführen, werden die Unterschiede auf Ihrem Terminal angezeigt.
In unserem Testfall erhalten wir als Ausgabe Folgendes.
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
Um dieses Modul als Teil eines Python-Skripts zu verwenden, können Sie ein Skript ähnlich dem folgenden schreiben.
from csv_diff import load_csv, compare
difference = compare(load_csv(open("file1.csv")), load_csv(open("file2.csv")))
print(difference)
Die Ausgabe dafür wird die folgende sein.
{'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': []}
Methode 3: Vergleichen Sie zwei CSV-Dateien mit Pandas DataFrames
Das folgende Skript kann diese Aufgabe für Sie erledigen.
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))
Bitte beachten Sie, dass in der Methode read_csv
das Argument header=None
eingetragen wird, da unsere Testdatei keinen Header hat. Wenn Ihre Datei einen Header hat, können Sie ihn lesen mit: pd.read_csv("file1.csv")
, wobei file1.csv
stattdessen durch Ihre Datei ersetzt wird.
Falls sich Ihre Datei nicht im selben Verzeichnis wie Ihr Skript befindet, geben Sie bitte den vollständigen Pfad zu Ihren CSV-Dateien an.
Die obigen Python-Skripte sollten eine Ausgabe wie die folgende erzeugen:
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
Die Zeilen neben left_only
und right_only
enthalten alle Unterschiede. Die Zeile neben _merge
repräsentiert nur Indizes.