Python:删除重复的CSV条目

Python:删除重复的CSV条目,python,csv,Python,Csv,我有一个包含多个条目的CSV文件。示例csv: user, phone, email joe, 123, joe@x.com mary, 456, mary@x.com ed, 123, ed@x.com 我试图通过CSV中的特定列删除重复项,但是使用下面的代码,我得到了一个“列表索引超出范围”。我想通过比较行[1]和新行[1]我会找到所有重复项,只重写file2.csv中的唯一项。但这不起作用,我不明白为什么 f1 = csv.reader(open('file1.csv', 'rb'))

我有一个包含多个条目的CSV文件。示例csv:

user, phone, email
joe, 123, joe@x.com
mary, 456, mary@x.com
ed, 123, ed@x.com
我试图通过CSV中的特定列删除重复项,但是使用下面的代码,我得到了一个“列表索引超出范围”。我想通过比较
行[1]
新行[1]
我会找到所有重复项,只重写
file2.csv
中的唯一项。但这不起作用,我不明白为什么

f1 = csv.reader(open('file1.csv', 'rb'))
    newrows = []
    for row in f1:
        if row[1] not in newrows[1]:
            newrows.append(row)
    writer = csv.writer(open("file2.csv", "wb"))
    writer.writerows(newrows)
我的最终结果是有一个维护文件序列的列表(
set
will not work…right?),它应该如下所示:

user, phone, email
joe, 123, joe@x.com
mary, 456, mary@x.com

行[1]
指当前行(电话)中的第二列。这一切都很好

但是,您可以
newrows.append(row)
将整行添加到列表中

当您选中新行中的
行[1]时,您正在对照完整行列表检查单个电话号码。但那不是你想做的。你需要核对一个列表或一组电话号码。为此,您可能希望跟踪行和一组观察到的电话号码

比如:

f1 = csv.reader(open('file1.csv', 'rb'))
writer = csv.writer(open("file2.csv", "wb"))
phone_numbers = set()
for row in f1:
    if row[1] not in phone_numbers:
        writer.writerow(row)
        phone_numbers.add( row[1] )

这个解决方案对我来说很有效,但由于我是Python新手,有人能解释一下最后一点吗

writer.writerow(row)
phone_numbers.add( row[1] )

我知道作者查看文件“file2.csv”并写入每一行。什么电话号码.add(第[1]行)可以消除重复的电话号码?

我知道这已经过去很久了,但如果其他人在这里登陆,请找到更好的答案。

我认为数据库在这里非常有用。Python是用SQLite实现OOB的,你知道吗?当某些东西不起作用时,你总是需要描述发生了什么。这是一个错误吗?没什么吗?错了吗?我错了。。。我的代码当前生成的列表索引超出范围。这没有意义,因为它正在用第[1]行搜索第二个“列”。@serk,我的坏朋友错过了。不过,您通常应该包括完整的错误以及行号和回溯。这很有效。谢谢我认为
set
不起作用,因为它无法保持正确的输出顺序。如果我使用了
newrows
列表,并将
append(row)
修改为
writerow
,这仍然有效吗?@serk,set可以工作,因为我从不关心顺序。我只检查里面有没有东西。是的,添加到列表中会很好。顺便说一句,如果你真的要删除重复的电话号码,比如说电话营销数据库,那么你就有可能用这种方式浪费掉你的电话列表。有时,读卡器文件后面的电话号码会比读卡器文件前面的电话号码更新、更准确,因为它们会及时写入文件earlier,然后再写入读卡器文件后面的相同电话号码。
write.writerow(行)
应该是
writer.writerow(行)