使用python计算csv中的重复行

时间:2012-08-28 00:58:02

标签: python csv

我认为这对于一个体面的Python开发来说很容易 - 我还在学习!给定一个带有重复电子邮件的csv,我想迭代并写出重复电子邮件的数量,例如:

infile.csv

COLUMN 0
some@email.com
some@email.com
another@address.com
example@email.com

outfile.csv

COLUMN 0                 COLUMN 1
some@email.com           2
another@address.com      1
example@email.com        1

到目前为止,我可以使用

删除重复项
import csv

f = csv.reader(open('infile.csv','rb'))
writer = csv.writer(open('outfile.csv','wb'))
emails = set()


for row in f:
    if row[0] not in emails:
        writer.writerow(row)
        emails.add( row[0] )

但是我无法将计数写入新专栏。

3 个答案:

答案 0 :(得分:4)

在Python2.6中使用 defaultdict

from collections import defaultdict

# count all the emails before we write anything out
emails = defaultdict(int)
for row in f:
    emails[row[0]] += 1

# now write the file
for row in email.items():
    writer.writerow(row)

答案 1 :(得分:3)

尝试counter。它专为此类用途而设计:

from collections import Counter

emails=Counter()
for row in f:
    emails+=Counter([row[0]])

打印:

Counter({'some@email.com': 2, 'another@address.com': 1, 'example@email.com': 1, 'COLUMN 0': 1})

从计数器中获取任何其他数据结构很容易:

print set(emails.elements())
# set(['another@address.com', 'COLUMN 0', 'example@email.com', 'some@email.com']) 

请注意,我没有跳过标题或写出csv - 这很容易做到。

答案 2 :(得分:1)

对于Python 2.6,您可以尝试类似于鸽子类的东西: http://en.m.wikipedia.org/wiki/Pigeonhole_sort

这实际上是针对这种确切的问题而制作的。

对于实际设置,使用字典来保存数据然后迭代它,而不是在你去的时候尝试写出信息。