读取csv文件并在另一个csv文件中仅添加新条目

时间:2015-08-05 08:59:40

标签: python csv

我有一个csv文件,我每天都有重复和唯一的数据添加到它。这涉及太多重复。我必须根据特定列删除重复项。例如:

csvfile1:

title1 title2 title3 title4 title5
abcdef 12     13     14     15
jklmn  12     13     56     76
abcdef 12     13     98     89
bvnjkl 56     76     86     96

现在,基于title1,title2和title3,我必须删除重复项并在新的csv文件中添加唯一条目。正如您所看到的,abcdef行不是唯一的,并且基于title1,title2和title3重复,因此它应该被删除,输出应该如下所示:

预期输出CSV文件:

title1 title2 title3 title4 title5
jklmn  12     13     56     76
bvnjkl 56     76     86     96

我尝试过的代码如下:CSVINPUT文件     import csv

f = open("1.csv", 'a+')

writer = csv.writer(f)

writer.writerow(("t1", "t2", "t3"))

a =[["a", 'b', 'c'], ["g", "h", "i"],['a','b','c']] #This list is changed daily so new and duplicates data get added daily


for i in range(2):
    writer.writerow((a[i]))

f.close()

重复删除脚本:

import csv




with open('1.csv','r') as in_file, open('2.csv','w') as out_file:
    seen = set() # set for fast O(1) amortized lookup
    for line in in_file:
        if line not in seen: continue # skip duplicate


        out_file.write(line)

我的输出: 2.csv:

t1 t2 t3
a  b  c
g  h  i

现在,我不希望基于t1和t2的2.csv中的b c仅基于t1和t2的唯一g h i

1 个答案:

答案 0 :(得分:2)

代码中的一些问题 -

  1. 在用于创建csv文件的python文件中,您只是迭代直到 - range(2)range不包含,所以它只将前两列写入csv,而不是第三个,你可以直接迭代csv,而不是迭代每个元素。此外,writer.writerow(),例如 -

    中不需要那么多括号
    for i in a:
        writer.writerow(i)
    
  2. 在您的重复删除脚本中,您实际上从未向seen()添加任何内容,因此您永远不会删除任何内容。如果要根据列表元素的子集删除重复项,只需将这些元素(按特定顺序)添加到seen集(作为元组),而不是列表,因为{{1只接受hashable元素。然后在检查集合中的包含时,仅检查您添加的子集。示例 -

    set()
  3. 这将完成删除基于第一列和第二列复制的所有行。它甚至不会为这些行存储单行,我猜这就是你想要的。

    import csv with open('1.csv','r') as in_file, open('2.csv','w') as out_file: seen = set() seentwice = set() reader = csv.reader(in_file) writer = csv.writer(out_file) rows = [] for row in reader: if (row[0],row[1]) in seen: seentwice.add((row[0],row[1])) seen.add((row[0],row[1])) rows.append(row) for row in rows: if (row[0],row[1]) not in seentwice: writer.writerow(row) - set - 用于存储我们已经看过的行。

    seen - set - 如果遇到之前已添加到seentwice的行,则此行仅填充一行,这意味着该行重复。

    现在最后,我们只想写不在seen内的rows,因为seentwice中的任何row表示它是重复的,该行有至少两个不同的行,seentwicerow[0]具有相似的值。