Vergleichen Sie zwei CSV-Dateien und drucken Sie Unterschiede mit Python

Faaiq Bilal 21 Juni 2023
  1. Methode 1: Vergleichen Sie zwei CSV-Dateien mit der pythonischsten Lösung
  2. Methode 2: Vergleichen Sie zwei CSV-Dateien mit csv-diff - einem externen Modul
  3. Methode 3: Vergleichen Sie zwei CSV-Dateien mit Pandas DataFrames
Vergleichen Sie zwei CSV-Dateien und drucken Sie Unterschiede mit Python

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.

Verwandter Artikel - Python CSV