Python 3读取csv并保留最新的重复项

时间:2016-02-26 17:22:34

标签: csv python-3.x duplicates

我有一个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])

2 个答案:

答案 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()

您可能希望再次对结果进行排序,因为字典的性质可以按任意顺序显示值。

虽未测试过!