Tengo 2 CSV que son New.csv y Old.csv que tienen alrededor de 1K filas y 10 columnas que tienen una estructura como esta:

enter image description here

Si hay un nombre largo (primera columna) en new.csv que no está en old.csv, me gustaría que toda la fila new.csv se agregara al changes.csv.

Empecé haciendo esto pero no funciona nada bien:

def deltaFileMaker():
    with open('Old.csv', 'r', encoding='utf-8') as t1, open('New.csv', 'r', encoding='utf-8') as t2:
        fileone = t1.readlines()
        filetwo = t2.readlines()

    with open('changes.csv', 'w', encoding='utf-8') as outFile:
        for line in filetwo:
            if line not in fileone:
                outFile.write(line)



deltaFileMaker()

También intenté usar csv-diff pero no pude encontrar una manera de convertir su salida a un archivo csv

Actualizar

def deltaFileMaker():
    from csv_diff import load_csv, compare
    diff = compare(
        load_csv(open("old.csv",encoding="utf8"), key="longName"),
        load_csv(open("new.csv",encoding="utf8"), key="longName")
    )

        with open('changes.csv', 'w',encoding="utf8") as f:  
        w = csv.DictWriter(f, diff.keys())
        w.writeheader()
        w.writerow(diff)


deltaFileMaker()


Haciendo esto: ingrese la descripción de la imagen aquí

2
joe_sanders 21 oct. 2020 a las 21:19

1 respuesta

La mejor respuesta

¿Has mirado a csv-diff? Su sitio web tiene un ejemplo que podría ser adecuado:

from csv_diff import load_csv, compare
diff = compare(
    load_csv(open("one.csv"), key="id"),
    load_csv(open("two.csv"), key="id")
)

Esto debería devolver un objeto dict, que puede analizar en un archivo CSV. Para analizar ese dictado en filas, este es un ejemplo. Nota: conseguir que los cambios se escriban correctamente es difícil, pero esto es más una prueba de concepto: modifique como desee

from csv_diff import load_csv, compare
fro csv import DictWriter

# Get all the row headers across all the changes
headers = set({'change type'})
for key, vals in diff.items():
    for val in vals: # Multiple of the same difference 'type'
        headers = headers.union(set(val.keys()))

# Write changes to file
with open('changes.csv', 'w', encoding='utf-8') as fh:
    w = DictWriter(fh, headers)
    w.writeheader()
    for key, changes in diff.items():
        for val in changes: # Add each instance of this type of change
            val.update({'change type': key}) # Add 'change type' data
            w.writerow(val)

Para el archivo one.csv:

id,     name, age
 1,     Cleo,   4
 2, Pancakes,   2

Y two.csv:

id,   name, age
 1,   Cleo,   5
 3, Bailey,   1
4,  Elliot,  10

Ejecutar esto produce:

change type,     name, id,               changes, age, key
      added,   Bailey,  3,                      ,   1,
      added,   Elliot,  4,                      ,  10,
    removed, Pancakes,  2,                      ,   2,
    changed,         ,   , "{'age': ['4', '5']}",    ,   1

Por lo tanto, no es excelente para todos los cambios, pero funciona muy bien para las filas agregadas / eliminadas.

2
Collin Heist 21 oct. 2020 a las 22:20