Compare dos archivos CSV e imprima las diferencias usando Python
- Método 1: compare dos archivos CSV utilizando la solución más pitónica
-
Método 2: Comparar dos archivos CSV usando
csv-diff
- Un módulo externo - Método 3: Comparar dos archivos CSV usando Pandas DataFrames
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.