比较 2 个单独的 csv 文件并将差异写入新的 csv 文件 - Python 2.7

Compare 2 seperate csv files and write difference to a new csv file - Python 2.7

我正在尝试比较 python 中的两个 csv 文件,并将差异保存到 python 2.7 中的第三个 csv 文件。

import csv

f1 = open ("olddata/file1.csv")
oldFile1 = csv.reader(f1)
oldList1 = []
for row in oldFile1:
    oldList1.append(row)

f2 = open ("newdata/file2.csv")
oldFile2 = csv.reader(f2)
oldList2 = []
for row in oldFile2:
    oldList2.append(row)

f1.close()
f2.close()

set1 = tuple(oldList1)
set2 = tuple(oldList2)

print oldList2.difference(oldList1)

我收到错误消息:

Traceback (most recent call last):
  File "compare.py", line 21, in <module>
    print oldList2.difference(oldList1)
AttributeError: 'list' object has no attribute 'difference'

我是 python 的新手,一般来说是编码,我还没有完成这段代码(我必须确保将差异存储到一个变量并将差异写入一个新的csv 文件)。我整天都在努力解决这个问题,但我就是做不到。非常感谢您的帮助。

错误正确:元组没有"difference"方法。

我猜你想使用 set(并使元素不可变)?

set1 = set([tuple(item) for item in oldList1])
set2 = set([tuple(item) for item in oldList2])
import csv

def read_csv_file(filename):
    res = []
    with open(filename) as f:
         for line in csv.reader(f):
               res.append(line)


oldList1 = read_csv_file("olddata/file1.csv")
oldList2 = read_csv_file("olddata/file2.csv")


difference_list = []

for a,b in zip(oldList1,oldList2):
   if a != b:
       difference_list.append(a + '\t' + b)

最终你有一个项目列表,你可以将它们写入文件。

编辑: 在这种情况下,[a,b,c] vs [b,c,a] 将失败。如果您知道 [a,b,c] 与 [b,c,a] 应该 return 没有区别,请使用以下代码。

import csv

def read_csv_file(filename):
    res = []
    with open(filename) as f:
         for line in csv.reader(f):
               res.append(line)


oldList1 = read_csv_file("olddata/file1.csv")
oldList2 = read_csv_file("olddata/file2.csv")


difference_list = []

for a in oldList1:
  for b in oldList2:
    if a != b:
       difference_list.append(a + '\t' + b)

你说的不同是什么意思?答案给了你两种截然不同的可能性。

如果当所有列相同时认为一行相同,那么您可以通过以下代码获得答案:

import csv

f1 = open ("olddata/file1.csv")
oldFile1 = csv.reader(f1)
oldList1 = []
for row in oldFile1:
    oldList1.append(row)

f2 = open ("newdata/file2.csv")
oldFile2 = csv.reader(f2)
oldList2 = []
for row in oldFile2:
    oldList2.append(row)

f1.close()
f2.close()

print [row for row in oldList1 if row not in oldList2]

但是,如果某个关键字段(即列)相同,则两行相同,那么下面的代码会给你答案:

import csv

f1 = open ("olddata/file1.csv")
oldFile1 = csv.reader(f1)
oldList1 = []
for row in oldFile1:
    oldList1.append(row)

f2 = open ("newdata/file2.csv")
oldFile2 = csv.reader(f2)
oldList2 = []
for row in oldFile2:
    oldList2.append(row)

f1.close()
f2.close()

keyfield = 0 # Change this for choosing the column number

oldList2keys = [row[keyfield] for row in oldList2]
print [row for row in oldList1 if row[keyfield] not in oldList2keys]

注意:以上代码对于非常大的文件可能 运行 变慢。相反,如果您希望通过散列来加速代码,则可以在使用以下代码转换 oldList 之后使用 set

set1 = set(tuple(row) for row in oldList1)
set2 = set(tuple(row) for row in oldList2)

在此之后,您可以使用set1.difference(set2)