Python:删除CSV重复条目

5 投票
3 回答
9280 浏览
提问于 2025-04-17 03:50

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

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

我想通过CSV中的某一列来去除重复项,但使用下面的代码时出现了“列表索引超出范围”的错误。我原以为通过比较 row[1]newrows[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 可能不适用,对吧?),应该看起来像这样:

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

3 个回答

0

我知道这个问题已经过去很久了,但如果还有其他人看到这里,请在这里找到更好的答案。

0

这个解决方案对我有效,但因为我刚接触Python,能不能有人解释一下最后那部分?

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

我明白writer是查看“file2.csv”这个文件,并把每一行写进去。那么phone_numbers.add(row[1])是怎么去除重复的呢?

9

row[1] 指的是当前行的第二列(也就是电话)。这没什么问题。

但是,你用 newrows.append(row) 把整行数据添加到了列表里。

当你检查 row[1] in newrows 时,其实是在把单独的电话号码和完整的行进行比较。但这并不是你想要的。你需要的是一个只包含电话号码的列表或集合。为此,你可能需要同时记录行数据和已经观察到的电话号码。

可以这样做:

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] )

撰写回答