我有一个csv文件,我试图删除具有重复电子邮件地址的行。如果电子邮件地址是重复的,我希望保留具有最高ID的行。
id email _website _store confirmation
11 test@abc.com base default 1
12 test2@abc.com base default 1
13 test@abc.com base default 1
我已经能够使用下面的脚本打印出重复项列表,但我需要写一个带有最新ID的csv。
for row in csv_f:
if row[1] not in seen:
seen.add(row[1])
else:
if (row[1] > ''):
pprint.pprint (row[1])
答案 0 :(得分:0)
你不能写出最新的"没有读取文件中的所有项目。因为最后一行可能包含更新。
因此,您必须全部阅读它们,并确定要删除哪些内容,或确定要保留哪些内容。这是一个保持方法:
seen = {}
EMAIL=1
user_list = []
for user in csv_f:
seen[user[EMAIL]] = len(user_list) # index of next .append
user_list.append(user)
for n,user in enumerate(user_list):
if seen[user[EMAIL]] == n:
output(user) # Write it, print it, whatever
答案 1 :(得分:0)
与Austin's answer类似,我建议使用覆盖方法:
d = {} # mail: row
for row in sorted(csv_f): # should be sorted by the first field (aka ID)
d[row[1]] = row
pprint.pprint(d.values())
此处,电子邮件用作密钥,具有相同密钥的即将到来的行只会覆盖存储的行。由于它按ID排序,因此最后一次覆盖必须是该电子邮件地址的ID最高的覆盖。
单行将是v = {r[1]: r for r in sorted(csv_f)}.values()
。
您可能希望再次对结果进行排序,因为字典的性质可以按任意顺序显示值。
虽未测试过!