python csv读取多列_关于python:比较两个多列csv文件

[使用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'))

编辑:该文件可以包含重复项,因此存储在集合中将不起作用(因为它将删除所有重复项,对吗?).

您提到"行的顺序可能不同"。你能在比较之前对它们进行排序吗,或者不同的排序方式是你想要的不同?

try-while块只在diff上迭代,您应该使用for循环:

count = 0

for delta in diff:

count += 1

或者是一个更像是Python产生器的表达方式。

count = sum(1 for delta in diff)

(原始代码在每次迭代之前递增count,从而使计数增加一个。我想知道您的情况是否正确。)

感谢这个Janne,我目前正在运行修改过的代码,但它需要很长时间才能完成——这很奇怪?

要回答您关于while 1的问题:

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

diff.ndiff()是一个生成器,它返回和迭代器。循环正在通过调用Next()对其进行迭代。只要找到diff(迭代器移到下一个),它就会增加计数(这会给出不同的行总数)。

嗨,Mukul,我确实得到了关于生成器和迭代器的部分,但我认为我肯定需要更多关于这方面的知识,因为我对(python)编程非常陌生。感谢您的输入!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值