【问题标题】:How to compare two csv files and print all the differences如何比较两个 csv 文件并打印所有差异
【发布时间】:2020-10-20 19:16:59
【问题描述】:

我有两个 csv 文件 (old.csv and new.csv),其中包含大量数据。两个 csv 文件具有相同的数据,但每一行的排序可能不同。 old.csv 文件作为源文件。我很想比较两个 csv 文件,看看是否缺少任何行或是否有任何新行。

  • 比较old.csvnew.csv 并查看new.csv 中是否缺少任何行或new.csv 中是否存在任何新行。每行都应在两个 csv 中完全匹配。

下面的代码我只检查new.csv 中的新行,old.csv 中不存在,但我们如何才能检查所有其他内容。

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    fileone = t1.readlines()
    filetwo = t2.readlines()

with open('update.csv', 'w') as outFile:
    for line in filetwo:
        if line not in fileone:
            outFile.write(line)

基本上old.csvnew.csv 文件都应该与内容(每一行)、条目数和其他内容完全匹配。这两个文件应该没有任何区别。

【问题讨论】:

  • 为什么不对这两个文件进行比较?
  • 如果两个文件同时适合内存,您可以简单地将每个文件的行放在一个集合中并对其应用集合操作。
  • 是的,它可以放入内存中。只有几 mb 的文件。
  • 如果您碰巧在 Windows 上,请查看this answer。如果在 *nix 上,diff 呢,如之前的评论中所述。
  • @MichaelButscher 你能提供一个基于集合的方法的例子吗?

标签: python csv


【解决方案1】:

您可以考虑为此使用 difflib,但它与命令行 diff 具有相同的限制。当它只是被移动时,它可以将一条线报告为“新”。

假设顺序并不重要,那么基于集合的方法可能就是您所需要的。

【讨论】:

  • 这应该是评论,而不是答案。
  • 是的,基于集合的方法听起来不错。你能提供一个基于集合的方法的例子吗?
  • set(fileone).symmetric_difference(filetwo) 将为您提供一个元组,其中包含 fileone 在 [0] 处唯一的行和 filetwo 在 [1] 处唯一的所有行。
  • @AaronBentley 我用我尝试过的方法更新了我的问题。到目前为止,它给了我错误。
猜你喜欢
  • 2013-06-17
  • 2016-12-24
  • 2014-06-08
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2019-08-03
相关资源
最近更新 更多