python - 逐字段比较两个 CSV 文件并列出所有不匹配项

标签 python python-2.7 csv python-3.x compare

我尝试使用 Python 代码比较两个 CSV 文件。但是我的代码没有显示所有不匹配的地方。它只会显示每行的第一个不匹配项。我需要特定行中的所有不匹配项。

Python代码:

import csv, itertools
column_names = ['id','name','amount']
source_data = csv.reader(open('src.csv'))
target_data = csv.reader(open('tgt.csv'))
counter = 1
def rowElementCompare(sourceRow, targetRow):
    row_length = min(len(sourceRow), len(targetRow))
    for i in range(row_length):
        if sourceRow[i] != targetRow[i]:
            print i
            return i        
    return None
for source_row,target_row in itertools.izip(source_data,target_data):
    comparison_result = None
    comparison_result = rowElementCompare(source_row, target_row)
    #print (comparison_result)
    if comparison_result != None: #comparison_result is the column index at which the mismatch occured
        print "Mismatch in column %s on row number %d , source value %s, target value %s" % (column_names[comparison_result], counter, source_row[comparison_result], target_row[comparison_result])
    counter += 1

文件 1:

id,name,amount
1,bob,20
3,eva,8
3,sarah,7
4,jeff,19
6,fred,10

文件 2:

id,name,amount
1,bob,23
3,sarah,7
4,jeff,19
5,mira,81
6,fred,13

我的代码输出:

Mismatch in column amount on row number 2 , source value 20, target value 23 
Mismatch in column name on row number 3 , source value eva, target value sarah 
Mismatch in column id on row number 4 , source value 3, target value 4 
Mismatch in column id on row number 5 , source value 4, target value 5      
Mismatch in column amount on row number 6 , source value 10, target value 13

预期输出:

Mismatch in column amount on row number 2 , source value 20, target value 23 
Mismatch in column name on row number 3 , source value eva, target value sarah 
Mismatch in column id on row number 4 , source value 3, target value 4 
Mismatch in column name on row number 4 , source value sarah, target value jeff 
Mismatch in column age on row number 4 , source value 7, target value 19 
Mismatch in column id on row number 5 , source value 4, target value 5 
Mismatch in column name on row number 5 , source value jeff, target value mira 
Mismatch in column age on row number 5 , source value 19, target value 81 
...

最佳答案

问题是您每行只调用一次 rowElementCompare。此外,重复调用它也无济于事,因为它总是从行的开头开始,并在发现第一个不匹配时停止。

解决此问题的一种方法是将 rowElementCompare 更改为 yield它的结果而不是返回它。这样您就可以遍历该行中的所有不匹配项。

这是更新后的代码。更改的行用 # UPDATED 进行注释。

import csv, itertools
column_names = ['id','name','amount']
source_data = csv.reader(open('foo1.csv'))
target_data = csv.reader(open('foo2.csv'))
counter = 1
def rowElementCompare(sourceRow, targetRow):
    row_length = min(len(sourceRow), len(targetRow))
    for i in range(row_length):
        if sourceRow[i] != targetRow[i]:
            print i
            yield i # UPDATED
    return # UPDATED
for source_row,target_row in itertools.izip(source_data,target_data):
    comparison_result = None
    for comparison_result in rowElementCompare(source_row, target_row): # UPDATED
        print "Mismatch in column %s on row number %d , source value %s, target value %s" % (column_names[comparison_result], counter, source_row[comparison_result], target_row[comparison_result])
    counter += 1

清理代码的另一个小建议:您可以使用枚举来避免手动更新计数器变量。

for counter,(source_row,target_row) in enumerate(itertools.izip(source_data,target_data), start=1):

关于python - 逐字段比较两个 CSV 文件并列出所有不匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167815/

相关文章:

python 异步

python - 尝试在 CherryPy 服务器上部署 Flask 应用程序

python-2.7 - Pyrouge安装测试结果在 "FAILED (errors=10)"

php - 如何将内联翻译导出到另一个 Magento 商店?

python pandas导出的csv格式与导入的问题不同

python - Python 中的 JSON 提取。

python - pygame.key.set_repeat 用于操纵杆

python - 如何创建新的 Set Redis?

python - 使用请求模块未收到来自 HTTPS 站点的响应

python - 如何将数据框附加到现有的 csv 文件并删除重复数据