Compare two multiple-column csv files
[使用python3]我想比较两个csv文件的内容,如果内容相同,就让脚本打印出来。换句话说,它应该让我知道所有行是否匹配,如果不匹配,还应该知道不匹配的行数。
另外,我希望以后能够灵活地更改代码,以写入与另一个文件不匹配的所有行。
此外,尽管两个文件在技术上应该包含完全相同的内容,但行的顺序可能不同(第一行除外,它包含头)。
输入文件如下所示:
1 2 3 4 5 6 7 | 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式的)方法。另外,我不确定
由于我是新来的,所以我非常希望收到关于代码的任何反馈,同时也希望您对任何可能的建议作出解释。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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块只在
1 2 3 | count = 0 for delta in diff: count += 1 |
或者是一个更像是Python产生器的表达方式。
1 | count = sum(1 for delta in diff) |
号
(原始代码在每次迭代之前递增
要回答您关于while 1的问题:
请阅读有关生成器和迭代器的更多信息。
diff.ndiff()是一个生成器,它返回和迭代器。循环正在通过调用Next()对其进行迭代。只要找到diff(迭代器移到下一个),它就会增加计数(这会给出不同的行总数)。