Skip to main content
 首页 » 编程设计

python之使用 Python 2.7 比较 2 个 csv 文件并将不同的行输出到第三个 CSV 文件

2025年05月04日14qq78292959

我正在尝试比较两个 csv 文件并使用 python 2.7 查找不同的行。当所有列不相同时,行被认为是不同的。这些文件将采用相同的格式,所有相同的列都将采用这种格式。

oldfile.csv 
ID      name     Date          Amount 
1       John     6/16/2015     $3000 
2       Adam     6/16/2015     $4000 
 
newfile.csv 
ID      name     Date          Amount 
1       John     6/16/2015     $3000 
2       Adam     6/16/2015     $4000 
3       Sam      6/17/2015     $5000 
4       Dan      6/17/2015     $6000 

当我运行我的脚本时,我希望输出只是底部的两行并写入一个 csv 文件,不幸的是我无法让我的代码正常工作。我在下面写的内容打印出 oldfile.csv 的内容,但不打印不同的行。我想要代码做的是打印出 output.csv 文件中的最后一行。即

output.csv 
3       Sam      6/17/2015     $5000 
4       Dan      6/17/2015     $6000 

这是我使用 csv 模块的 python 2.7 代码。

import csv 
 
f1 = open ("olddata/olddata.csv") 
oldFile1 = csv.reader(f1) 
oldList1 = [] 
for row in oldFile1: 
    oldList1.append(row) 
 
f2 = open ("newdata/newdata.csv") 
newFile2 = csv.reader(f2) 
newList2 = [] 
for row in newFile2: 
    newList2.append(row) 
 
f1.close() 
f2.close() 
 
output =  [row for row in oldList1 if row not in newList2] 
 
print output 

不幸的是,代码只打印出 oldfile.csv 的内容。我整天都在研究它并尝试不同的变体,但我就是无法让它正常工作。再次感谢您的帮助。

请您参考如下方法:

您当前正在检查存在于旧文件 但不在新文件 中的行。那不是你想要做的。

相反,您应该检查新文件中存在但不在新文件中的行:

output =  [row for row in newList2 if row not in oldList1] 

此外,您的 CSV 文件是 TSV,因此无法正确加载。您应该指示 csv 模块使用 TSV 打开您的文件。您的代码也可以得到简化。

以下是您可以使用的内容:

import csv 
 
f1 = open ("olddata/olddata.csv") 
oldFile1 = csv.reader(f1, delimiter='\t') 
oldList1 = list(oldFile1) 
 
f2 = open ("newdata/newdata.csv") 
newFile2 = csv.reader(f2, delimiter='\t') 
newList2 = list(newFile2) 
 
f1.close() 
f2.close() 
 
output1 =  [row for row in newList2 if row not in oldList1] 
output2 =  [row for row in oldList1 if row not in newList2] 
 
print output1 + output2