2013-05-08 67 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) 

快速和容易!