【问题标题】:Compare 2 seperate csv files and write difference to a new csv file - Python 2.7比较 2 个单独的 csv 文件并将差异写入一个新的 csv 文件 - Python 2.7
【发布时间】:2015-06-15 18:43:10
【问题描述】:

我正在尝试比较 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 文件。)。我整天都在尝试解决这个问题,但我根本做不到。您的帮助将不胜感激。

【问题讨论】:

  • 您将listset 混淆了

标签: python python-2.7 csv compare


【解决方案1】:

你所说的差异是什么意思?答案为您提供了两种截然不同的可能性。

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

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]

注意: 对于超大文件,上述代码可能运行缓慢。相反,如果您希望通过散列加速代码,您可以在使用以下代码转换 oldLists 后使用 set

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

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

【讨论】:

  • 对不起,我应该更清楚一点。我的意思是说当所有列都相同时,所以我使用了您所做的编辑并且它起作用了。问题是现在我想将输出写入 csv 文件。
  • 还有@Jay Bosamiya,感谢您的回答。忘记那部分了。
【解决方案2】:
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] 应该没有区别,请使用以下代码。

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)

【讨论】:

  • 拜托,做一个好人,改变一个功能的复制粘贴;) p.s.您的代码将在 [a,b,c] vs [b,c,a] 上失败
  • @Jimilian 你是对的!让我想想如何解决它,如果你知道如何解决它,很想得到你的意见:-)
  • @Jimilian 非常感谢您清理我的代码,如果问题的作者知道 [a,b,c] vs [b,c,a] 不应该,我将添加另一个选项不会失败
  • 现在我收到以下错误消息“只能将列表(而不是 str)连接到列表”......我开始认为我必须重新从头开始。
  • @Kevin Zhao,如果您尝试在没有集合且没有平方复杂度的情况下进行操作,您应该遍历一个列表并从另一个列表中删除元素。切换它们并重复。在这两个操作之后,您将收到两个具有唯一元素的列表。
【解决方案3】:

错误是正确的:元组没有“差异”方法。

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

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

【讨论】:

  • 当我将它更改为一个集合时,它给了我错误 unhashable type: 'list'
  • 确实,您可以将列表(也是列表)中的项目转换为元组。请参阅编辑后的答案。
猜你喜欢
  • 1970-01-01
  • 2014-06-08
  • 2016-07-13
  • 2018-11-19
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多