Compare dos archivos CSV e imprima las diferencias usando Python

Faaiq Bilal 21 junio 2023
  1. Método 1: compare dos archivos CSV utilizando la solución más pitónica
  2. Método 2: Comparar dos archivos CSV usando csv-diff - Un módulo externo
  3. Método 3: Comparar dos archivos CSV usando Pandas DataFrames
Compare dos archivos CSV e imprima las diferencias usando Python

Este artículo discutirá varios métodos para comparar dos archivos CSV. Incluiremos la forma más “Pythonic” de realizar esta operación y un módulo externo de Python que puede ayudar a simplificar esta tarea.

Por último, incluiremos un método usando Pandas DataFrames para identificar diferencias en los archivos CSV.

Asumiremos que los dos archivos CSV que necesitamos comparar se titulan file1.csv y file2.csv. Puede cambiar el nombre de los archivos como mejor le parezca.

También reemplace los nombres de archivo de manera adecuada en los fragmentos de código que se proporcionan a continuación.

A modo de ejemplo, tenemos nuestros archivos configurados de la siguiente manera:

archivo1.csv:

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

archivo2.csv:

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

Método 1: compare dos archivos CSV utilizando la solución más pitónica

En este método, leemos el contenido del archivo en dos listas, iteramos sobre una de las listas y verificamos si cada una de las líneas existe o no en la segunda lista. Lógicamente, esta es una solución muy sencilla.

Las eficiencias subyacentes de Python hacen que esta comparación sea bastante eficiente, a pesar de lo que parece.

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)

El fragmento de código anterior imprimirá las diferentes líneas en su terminal.

En nuestro caso de prueba, obtenemos lo siguiente como salida.

1,3,4,5,6,1

2,3,1,4,1,5

Método 2: Comparar dos archivos CSV usando csv-diff - Un módulo externo

En primer lugar, instale el módulo usando el siguiente comando en su terminal.

python3 -m pip install csv-diff

Una vez instalado, no necesita escribir un script de Python. Puede ejecutar esto directamente en la terminal con el siguiente comando.

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

Ejecutar este comando mostrará las diferencias en su terminal.

En nuestro caso de prueba, obtenemos lo siguiente como salida.

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

Para usar este módulo como parte de una secuencia de comandos de Python, puede escribir una secuencia de comandos similar a la siguiente.

from csv_diff import load_csv, compare

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

La salida para esto será la siguiente.

{'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': []}

Método 3: Comparar dos archivos CSV usando Pandas DataFrames

El siguiente script puede realizar esta tarea por usted.

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))

Tenga en cuenta que en el método read_csv, se ingresa el argumento header=None porque nuestro archivo de prueba no tiene ningún encabezado. Si su archivo tiene un encabezado, puede leerlo usando: pd.read_csv("file1.csv"), donde file1.csv será reemplazado por su archivo.

En caso de que su archivo no esté presente en el mismo directorio que su secuencia de comandos, proporcione la ruta completa a sus archivos CSV.

Los scripts de Python anteriores deberían generar una salida como:

   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

Las líneas junto a left_only y right_only contienen todas las diferencias. La línea al lado de _merge solo representa índices.

Artículo relacionado - Python CSV