如何在Python中使用分组变量高效处理大型文件

时间:2015-01-30 19:00:58

标签: python

我有一个类似于以下内容的数据集:

ID   Group
1001 2
1006 2
1008 1
1027 2
1013 1
1014 4

所以基本上,还有很长的未分类ID列表以及分组变量。

目前,我想根据随机数的生成来获取此列表的子集(想象它们正在起草,或者赢得彩票等)。现在,这是我用来逐行处理ID的代码。

reader = csv.reader(open(inputname), delimiter=' ')
out1 = open(output1name,'wb')
out2 = open(output2name,'wb')

for row in reader:
    assignment = gcd(1,p,marg_rate,rho)
    if assignment[0,0]==1:
        out1.write(row[0])
        out1.write("\n")
    if assignment[0,1]==1:
        out2.write(row[0])
        out2.write("\n")

基本上,我的gcd()函数是单向的,你被写入一个文件,另一种方式写入一秒,然后一些被抛出。问题是我现在想通过 Group 而不是ID这样做 - 基本上,我想在组成员第一次出现时分配值,然后将其应用于所有该组的成员(例如,如果1001转到文件2,那么1006和1027也是如此。)

有没有一种有效的方法在Python中执行此操作?该文件足够大,我对我的第一个想法有点警惕,即在字典或列表中进行分配,然后让程序查找每一行。

2 个答案:

答案 0 :(得分:1)

我使用random.randint生成一个随机数,但这很容易被替换。

我们的想法是使用defaultdict从一个组创建之时就单个得分(dict键是唯一的):

import csv
import random
from collections import defaultdict

reader = csv.DictReader(open(inputname), delimiter=' ')
out1 = open(output1name,'wb')
out2 = open(output2name,'wb')

# create a dictionary with a random default integer value [0, 1] for
# keys that are accessed for the first time
group_scores = defaultdict(lambda: random.randint(0,1))

for row in reader:
    # set a score for current row according to it's group
    # if none found - defaultdict will call it's lambda for new keys
    # and create a score for this row and all who follow
    score = group_scores[row['Group']]
    if score==0:
        out1.write(row['ID'])
        out1.write("\n")
    if score==1:
        out2.write(row['ID'])
        out2.write("\n")

out1.close()
out2.close()

我还使用DictReader,我发现带有标题的csv文件更好。

提示:您可能希望使用with context manager打开文件。

示例输出:

reut@sharabani:~/python/ran$ cat out1.txt 
1001
1006
1008
1027
1013
reut@sharabani:~/python/ran$ cat out2.txt 
1014

答案 1 :(得分:0)

听起来你正在寻找一个映射。您可以使用dicts。

一旦你第一次确定1001转到文件2,你就可以添加到你的映射字典。

fileMap={}

fileMap[group]="fileName" 

然后,当您需要检查该组是否已经确定时,您只需

>>>group in fileMap
True

这不是将每个ID映射到文件名。只需映射组。

另外,我想知道是否值得考虑使用.write([aListofLines])批量写入。