【问题标题】:How to compare 2 different csv files and output the differences如何比较 2 个不同的 csv 文件并输出差异
【发布时间】:2020-10-21 18:19:24
【问题描述】:

我有 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()


这样做:

【问题讨论】:

  • 你使用 csv-diff 的代码是什么?
  • 我只是做了通用的csv-diff new.csv old.csv --key=id,我不知道如何用它做任何其他事情
  • 你用的是--key=id还是--key=longName
  • 抱歉,我用的是 longName
  • 如果有一种方法可以将 csv-diff 转换为完美的 csv 文件

标签: python python-3.x csv compare


【解决方案1】:

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

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 文件。要将 that dict 解析为行,这是一个示例。 注意:正确编写更改很困难,但这更像是一个概念验证 - 随意修改

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)

对于文件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

所以不是对所有更改都很好,但对添加/删除的行非常有效。

【讨论】:

  • 我试过这样做,但我一定是做错了什么。请看我的更新。如果我可以将其拆分为 changes.csv 中的 3 个单独的表,并添加、更改和删除,那将是惊人的。
  • 您的更新有什么问题?
  • 刚刚添加了一个屏幕截图,它将所有信息放在称为添加、删除和更改的列中。
  • 我会更新我的帖子,用一种方法来做你所要求的 :) @joe_sanders
  • 那是我的错,我以前从未使用过csv_diff,我将修改我的示例以允许>1添加/删除@joe_sanders
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多