【问题标题】:Compare two multiple-column csv files比较两个多列 csv 文件
【发布时间】:2013-06-18 12:24:48
【问题描述】:

[使用Python3]我想比较两个csv文件的内容,如果内容相同则让脚本打印。换句话说,它应该让我知道是否所有行都匹配,如果不匹配,则不匹配的行数。

我还希望以后可以灵活地更改代码以将所有不匹配的行写入另一个文件。

此外,虽然这两个文件在技术上应该包含完全相同的内容,但行的顺序可能不同(第一行除外,它包含标题)。

输入文件如下所示:

field1  field2  field3  field4  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
string  float   float   string  ...
...     ...     ...     ...     ...

我目前正在运行的代码如下(如下),但老实说,我不确定这是否是最好的(最 Python 的)方式。我也不确定try: while 1: ... 代码在做什么。这段代码是我搜索论坛和 python 文档的结果。到目前为止,代码运行了很长时间。

由于我是新手,我非常渴望收到有关代码的任何反馈,并且还希望对您可能提出的任何建议进行解释。

代码:

import csv
import difflib

'''
Checks the content of two csv files and returns a message.
If there is a mismatch, it will output the number of mismatches.
'''

def compare(f1, f2):

    file1 = open(f1).readlines()
    file2 = open(f2).readlines()

    diff = difflib.ndiff(file1, file2)

    count = 0

    try:
        while 1:
            count += 1
            next(diff)
    except:
        pass

    return 'Checked {} rows and found {} mismatches'.format(len(file1), count)

print (compare('outfile.csv', 'test2.csv'))

编辑: 该文件可以包含重复项,因此无法将其存储在一个集合中(因为它会删除所有重复项,对吗?)。

【问题讨论】:

  • 您提到“行的顺序可能不同”。您可以在比较之前对它们进行排序,还是您正在寻找不同的排序差异?

标签: python csv python-3.x difflib


【解决方案1】:

try-while 块只是简单地迭代 diff,你应该使用 for 循环来代替:

count = 0
for delta in diff:
    count += 1

或者更 Python 的生成器表达式

count = sum(1 for delta in diff)

(原始代码在每次迭代之前递增count,因此计数会增加一。我想知道在您的情况下这是否正确。)

【讨论】:

  • 感谢 Janne,我目前正在运行更改后的代码,但需要很长时间才能完成 - 这很奇怪?
【解决方案2】:

回答你关于while 1的问题:

请阅读更多关于生成器和迭代器的信息。

Diff.ndiff() 是一个生成器,它返回和迭代器。循环通过调用 next() 对其进行迭代。只要找到差异(迭代器接下来移动),它就会增加计数(这会为您提供不同的总行数)

【讨论】:

  • 嗨 Mukul,我确实了解了生成器和迭代器的部分,但我认为我肯定需要更多关于该领域的知识,因为我对 (Python) 编程非常陌生。感谢您的意见!
猜你喜欢
  • 2021-04-27
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多