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

ben*_*ipy 1 python csv compare python-2.7

我试图比较两个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
Run Code Online (Sandbox Code Playgroud)

当我运行我的脚本时,我希望输出只是底部两行并写在csv文件中,遗憾的是我无法让我的代码正常工作.我在下面写的内容打印出oldfile.csv的内容,它不会打印不同的行.我想要的代码是打印输出到output.csv文件中的行.即

output.csv
3       Sam      6/17/2015     $5000
4       Dan      6/17/2015     $6000
Run Code Online (Sandbox Code Playgroud)

这是我使用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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,代码只打印出oldfile.csv的内容.我一整天都在努力尝试不同的变化,但我根本无法让它正常工作.再次,非常感谢您的帮助.

Tho*_*zco 5

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

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

output =  [row for row in newList2 if row not in oldList1]
Run Code Online (Sandbox Code Playgroud)

此外,您的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
Run Code Online (Sandbox Code Playgroud)

  • 检查这个简单的例子:`A = [1,2,3,4] B = [1,2,5,6] out1 = [如果行不在B中,则行中的行] out2 = [B中的行的行如果行不在A]中打印(out1 + out2)#[3,4,5,6]` (2认同)