Python:删除CSV重复条目
我有一个包含多个条目的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] )