我有一个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)
Run Code Online (Sandbox Code Playgroud)
我想加快速度的一种方法是找到一个更好的过滤器来减少必要的通过次数.假设行的长度均匀分布,可能代替
for day in days:
Run Code Online (Sandbox Code Playgroud)
和
if line['DayOfWeek']==day:
Run Code Online (Sandbox Code Playgroud)
我们有
for i in range(n):
Run Code Online (Sandbox Code Playgroud)
和
if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:
Run Code Online (Sandbox Code Playgroud)
其中'n'和内存一样小.但这仍然使用相同的方法.
Wayne Werner在下面提供了一个很好的实用解决方案; 我很好奇是否有更好/更快/更简单的方法从算法的角度来做这件事.
PS我只限于Python 2.5.
例如,如果我有
a=[['a','b','c'],[1,2,3],['d','e','f'],[4,5,6]]
如何在不必键入的情况下将每个元素a作为一个论证zip
zip(a[0],a[1],a[2],a[3])?
我在Python 2.6中使用Bing API编写了一个Web爬虫,它搜索某些文档,然后下载它们以便稍后进行分类.我一直在使用字符串方法并urllib.urlretrieve()下载其URL以.pdf,.ps等结尾的结果,但是当文档被"隐藏"在URL之后时,我遇到了麻烦:
http://www.oecd.org/officialdocuments/displaydocument/?cote=STD/CSTAT/WPNA(2008)25&docLanguage=En
那么,有两个问题.有没有一种方法可以判断一个URL是否有一个pdf/doc等文件,如果它没有这么明确地链接到它(例如www.domain.com/file.pdf)?有没有办法让Python抓住那个文件?
编辑:感谢您的回复,其中一些建议下载文件,看看它是否是正确的类型.唯一的问题是......我不知道该怎么做(见上面的问题#2).urlretrieve(<above url>)只给出一个html文件,其href包含相同的url.
我正在使用manage.py shell并运行这样的东西:
d=Document.objects.get(pk=1)
d.scores
{1:0,2:0,3:0}
d.scores[1]=5
d.scores
{1:5,2:0,3:0}
d.save()
Run Code Online (Sandbox Code Playgroud)
但d在数据库中查看显示它尚未更新.我究竟做错了什么??我查看了这里的内容,但d绝对是一个Document实例.
如果有帮助,models.py看起来像这样:
from django.db import models
class Document(models.Model):
fileName=models.CharField(max_length=200)
fileUrl=models.CharField(max_length=200)
scores={1:0,2:0,3:0}
Run Code Online (Sandbox Code Playgroud)