我有一个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
答案 0 :(得分:2)
代码中的一些问题 -
在用于创建csv文件的python文件中,您只是迭代直到 - range(2)
,range
不包含,所以它只将前两列写入csv,而不是第三个,你可以直接迭代csv,而不是迭代每个元素。此外,writer.writerow()
,例如 -
for i in a:
writer.writerow(i)
在您的重复删除脚本中,您实际上从未向seen()
添加任何内容,因此您永远不会删除任何内容。如果要根据列表元素的子集删除重复项,只需将这些元素(按特定顺序)添加到seen
集(作为元组),而不是列表,因为{{1只接受hashable元素。然后在检查集合中的包含时,仅检查您添加的子集。示例 -
set()
这将完成删除基于第一列和第二列复制的所有行。它甚至不会为这些行存储单行,我猜这就是你想要的。
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
表示它是重复的,该行有至少两个不同的行,seentwice
和row[0]
具有相似的值。