2013-05-08 184 views
0

經典csv讀取器在術語文檔數組上不起作用的原因是csv文件的第一列是術語,而不是值。因此,該文件的語法如下:使用python從csv讀取術語 - 文檔矩陣

"";"label1";"label2";"label3" ... 
"term1";1;0;8;... 
"term2";0;0;3;... 
................................. 

我需要建立一個詞典,其關鍵字是LABEL1,LABEL3等..和值的列向量(這將是:快譯通[LABEL1] - > 1,0,dict [label2] - > 0,0等),這意味着這些條款對我來說完全沒用。

我已經實現了它是這樣一個定製的解決方案:

.... 
keys = f.readline().split('";"') #1st line of the csv 
keys = keys[1:]     #skipping "" 
zeros = [0] * len(keys)   #dicts initial values will be 0 
d = OrderedDict(zip(keys, zeros)) 
lines = f.readlines() 
for line in lines: 
    ... 
    splittting, stripping etc I get a list with values (eg: 1,0,8 - see example above) 
    ... 
    for value in values: 
     .... 

但是讀8個CSV文件(共12MB)需要超過90分鐘,我的筆記本電腦。

有沒有人知道一個更有效的方式來處理這個問題?

+0

爲什麼你需要一個'OrderedDict'在這裏? – 2013-05-08 17:11:48

+0

你有沒有考慮用[pandas](http://pandas.pydata.org/)加載文件,然後遍歷列和行來製作字典? – 2013-05-08 17:12:38

回答

1

您可以使用csv模塊反正讀取CSV文件到內存中,然後使用zip(*rows)itertools.izip(*rows)轉行:

with open(somecsv, 'rb') as infile: 
    reader = csv.reader(infile, delimiter=';') 
    headers = next(reader) 
    data = list(reader) 
    data = dict(zip(headers, zip(*data))) 

這將創建一個data字典與標題密鑰和列的值。如果需要,您可以從字典中刪除'''terms'列。

您的輸入例如,data字典是這樣執行上面的代碼之後:

{'': ('term1', 'term2'), 'label1': ('1', '0'), 'label2': ('0', '0'), 'label3': ('8', '3')} 
+0

是不是'reader.next()'?如果我做'下一個(讀取器)',我會得到這個結果:'Traceback(最近一次調用最後一個): 文件「」,第1行,在 StopIteration' – 2013-05-08 17:48:48

+0

@RyanSaxe:'next()'是一個函數,我們會調用'reader.next()';在Python 3中,您必須調用'reader .__ next __()','next()'函數是適合使用的API。您已經打開一個空文件或者已經*已經*讀取了文件的所有內容; 'reader.next()'也會引發'StopIteration' *。 – 2013-05-08 17:50:10

+0

棒極了! 90+分鐘變成5-6秒!非常感謝! – chefarov 2013-05-08 18:24:52

1

熊貓顯然是要走的路!您只需將數據框加載到字典中即可。這裏是所有的代碼,它的快速和高效:

import pandas as pd 
data = pd.read_csv(filename) 
my_dict = dict(data) 

快速和容易!