我正在尝试比较两个 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
