2014-04-09 63 views
0

我有一個100K記錄的主列表,每個記錄都屬於公司編號。我試圖通過選擇每個公司編號2來創建一個樣本數據。 「def公司」貫穿數據並返回唯一的公司編號和每公司編號計數。從文件中獲取N行

我的腳本只輸出列表中第一個公司的2條記錄並停止,我怎樣才能得到每個公司的循環輸出2?

數據看起來像這樣(列[0]是該公司數):

'54', '000054', '14571', '  0000010023' 
'54', '000054', '14571', '  0000010033' 
'4', '000054', '14571', '  0000010024' 
'4', '000054', '14571', '  0000010023' 
'433', '000054', '14571', '  000001023423' 
'433', '000054', '14571', '  00000101563' 
'433', '000054', '14571', '  00000100234523' 
'433', '000054', '14571', '  00000100657823' 
'433', '000054', '14571', '  0000010SDF023' 
'78', '000054', '14571', '  000001002PIWEUR3' 
'78', '000054', '14571', '  00000100J23' 
'78', '000054', '14571', '  00000100222223' 
'78', '000054', '14571', '  000001002445' 
'12', '000054', '14571', '  0000010256' 
'12', '000054', '14571', '  000001005666' 




import os 
import sys 
import csv 
from collections import Counter 
masterlist = open('P:/20140408.txt', 'rb') 
data = csv.reader(masterlist, delimiter=",", quotechar='"') 

def Company(): 
    masterlist.seek(0) 
    cnt = Counter() 
    for row in data: 
     cnt[row[0]] +=1 

    return cnt 


def maintest(): 
    companylist = Company().keys() 
    masterlist.seek(0) 
    s = 2 


    for rows in data: 
     if rows[0] in companylist and s > 0: 
      print rows 
      s -=1 
maintest() 

回答

1

,而不是與櫃檯的東西,我會保持公司ID的一個簡單的映射 - >看作是你的次數通過循環走路:

seen = dict() 
for row in data: 
    n = seen.setdefault(row[0], 0) 
    if n < 2: 
     print row 
    seen[row[0]] += 1 
+0

非常感謝!!!此代碼完美無瑕,並清理了我的腳本。 –

0

如果你正在尋找一個真正的「樣本」,而不是前兩個,如果你能保存在內存中的所有數據,你可以這樣做:

import csv 
from collections import defaultdict 
from random import sample 

data=defaultdict(list) 

with open('/tmp/data.csv') as f: 
    reader=csv.reader(f, skipinitialspace=True, quotechar="'") 
    for line in reader: 
     data[line[0]].append(line[1:]) 

for k in data: 
    print k, sample(data[k], 2) 

與您的樣本數據爲csv文件,打印:

54 [['000054', '14571', '  0000010023'], ['000054', '14571', '  0000010033']] 
12 [['000054', '14571', '  0000010256'], ['000054', '14571', '  000001005666']] 
78 [['000054', '14571', '  000001002445'], ['000054', '14571', '  00000100J23']] 
4 [['000054', '14571', '  0000010023'], ['000054', '14571', '  0000010024']] 
433 [['000054', '14571', '  00000100234523'], ['000054', '14571', '  000001023423']] 
+0

要用實際的數據試試這個,因爲每個文件大約是800mb。 –

+0

對於大多數計算機而言,800 MB並不是很大,但是如果您的特定計算機掙扎,您可以在csv文件上使用枚舉,然後迴圈併爲每個鍵打印這兩個隨機行。 – dawg