<p>下面是一个代码示例,它将演示您在问题随附的示例数据中要查找的内容。我命名了我的输入文件“输入.csv从工作目录读/写输出.csv“转到同一文件夹。我在代码中使用注释来解释,将以前的记录存储在字典中,并按名称查找,并为每个记录存储一个分数列表—将当前日期记录存储在新的缓冲字典中,并在每次输入日期更改时将其添加到主词典中。如果您有任何问题,请告诉我,代码有点粗糙-只是一个简单的例子。[:6]片段给出了当前名称的最近6个列表项(前三个分数/参数对)。在</p>
<pre><code>import csv
myInput = open('input.csv','rb')
myOutput = open('output.csv','wb')
myFields = ['Datatitle','Date','Name','Score','Parameter','Text',
'LTscore','LTParameter','LTscore+1','LTParameter+1',
'LTscore+2','LTParameter+2']
inCsv = csv.DictReader(myInput,myFields)
outCsv = csv.writer(myOutput)
outCsv.writerow(myFields) # Write header row
previous_dict = dict() # store scores from previous dates
new_dict = dict() # buffer for records on current-date only
def add_new():
# merge new_dict into previous_dict
global new_dict, previous_dict
for k in new_dict:
if not previous_dict.has_key(k):
previous_dict[k] = list()
# put new items first
previous_dict[k] = new_dict[k] + previous_dict[k]
new_dict = dict() # reset buffer
old_date = '00/00/00' # start with bogus *oldest* date string
inCsv.next() # skip header row
for row in inCsv:
myTitle = row['Datatitle']
myDate = row['Date']
myName = row['Name']
myScore = row['Score']
myParameter = row['Parameter']
myText = row['Text']
if old_date != myDate:
add_new() # store new_dict buffer with previous data
old_date = myDate
if not new_dict.has_key(myName):
new_dict[myName] = []
# put new scores first
new_dict[myName] = [myScore,myParameter] + new_dict[myName]
if not previous_dict.has_key(myName):
previous_dict[myName] = []
outCsv.writerow([myTitle,myDate,myName,myScore,myParameter,myText] \
+ previous_dict[myName][:6])
# end loop for each row
myInput.close()
myOutput.close()
</code></pre>
<p>我的解决方案应该适合于大型数据集。如果内存消耗是一个问题,每个名字列表的长度可以限制为3个分数-目前我保留所有以前的分数,只是显示3个,以防你将来需要更多。如果数据的大小难以处理,您可以始终使用sqlite文件数据库而不是dict来临时查找磁盘上的数据,而不是全部存储在内存中。对于8G的RAM和2G的数据,您应该可以使用这里使用的内存python字典。确保在64位操作系统上使用64位版本的Python。我的示例没有向屏幕输出任何内容,但是对于一个大文件,您可能需要放置一个print语句,它每隔N行显示一次进度(比如每100、1000行,根据您的系统速度进行选择)。请注意,屏幕输出会减慢处理文件数据的速度。在</p>