为了账号安全,请及时绑定邮箱和手机立即绑定

如何比较2个不同的csv文件并输出差异

如何比较2个不同的csv文件并输出差异

扬帆大鱼 2023-12-12 15:18:46
我有 2 个 CSV,分别是 New.csv 和 Old.csv,它们大约有 1K 行和 10 列,其结构如下:如果 new.csv 中有一个 longName(第一列),而 old.csv 中没有,我希望将整个 new.csv 行附加到changes.csv。我一开始就这样做,但它根本不起作用: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()我也尝试使用 csv-diff 但找不到将其输出转换为 csv 文件的方法更新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()这样做:
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

你看过吗csv-diff?他们的网站有一个可能合适的示例:

from csv_diff import load_csv, compare

diff = compare(

    load_csv(open("one.csv"), key="id"),

    load_csv(open("two.csv"), key="id")

)

这应该返回一个dict对象,您可以将其解析为 CSV 文件。要将字典解析为行,这是一个示例。注意:正确编写更改很困难,但这更多的是概念验证 - 根据您的意愿进行修改


from csv_diff import load_csv, compare

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

对于文件one.csv:


id,     name, age

 1,     Cleo,   4

 2, Pancakes,   2

和two.csv:


id,   name, age

 1,   Cleo,   5

 3, Bailey,   1

4,  Elliot,  10

运行此命令会产生:


change type,     name, id,               changes, age, key

      added,   Bailey,  3,                      ,   1,

      added,   Elliot,  4,                      ,  10,

    removed, Pancakes,  2,                      ,   2,

    changed,         ,   , "{'age': ['4', '5']}",    ,   1

因此并不适合所有更改,但对于添加/删除的行非常有效。


查看完整回答
反对 回复 2023-12-12
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信