python去重复行_在Python中从大文件中删除重复行

我有一个csv文件,我想删除其中的重复行,但它太大,无法放入内存。我找到了一种方法来完成它,但我猜这不是最好的方法。

每行包含15个字段和几百个字符,所有字段都需要确定唯一性。与其比较整行以查找重复项,不如比较hash(row-as-a-string),以节省内存。我设置了一个过滤器,将数据划分成大致相等数量的行(例如一周中的几天),并且每个分区都足够小,以至于该分区的哈希值查找表可以放在内存中。我为每个分区传递一次文件,检查唯一的行并将它们写入第二个文件(伪代码):import csv

headers={'DayOfWeek':None, 'a':None, 'b':None}

outs=csv.DictWriter(open('c:\dedupedFile.csv','wb')

days=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

outs.writerows(headers)

for day in days:

htable={}

ins=csv.DictReader(open('c:\bigfile.csv','rb'),headers)

for line in ins:

hvalue=hash(reduce(lambda x,y:x+y,line.itervalues()))

if line['DayOfWeek']==day:

if hvalue in htable:

pass

else:

htable[hvalue]=None

outs.writerow(line)

我想加快速度的一个方法是找到一个更好的过滤器来减少必要的通过次数。假设行的长度是均匀分布的,可以代替for day in days:

以及if line['DayOfWeek']==day:

我们有for i in range(n):

以及if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:

在内存允许的范围内。但这仍然使用同样的方法。

Wayne Werner在下面提供了一个很好的实用解决方案;我很好奇是否有更好/更快/更简单的方法从算法的角度来实现这一点。

p.S.I仅限于Python2.5。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值