0

经典 csv 阅读器不适用于术语文档数组的原因是 csv 文件的第一列是术语,而不是值。因此,该文件具有以下语法:

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

我需要构建一个字典,其键是 label1、label3 等...而值是列向量(这里是:dict[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 多分钟。

有谁知道更有效的方法来处理这个问题?

4

2 回答 2

1

无论如何,您都可以使用该csv模块将 CSV 文件读入内存,然后使用zip(*rows)or转置行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字典,其中标题作为键,列作为值。''如果需要,您可以从字典中删除“术语”列。

对于您的输入示例,data执行上述代码后,字典如下所示:

{'': ('term1', 'term2'), 'label1': ('1', '0'), 'label2': ('0', '0'), 'label3': ('8', '3')}
于 2013-05-08T17:14:50.350 回答
1

熊猫显然是要走的路!您所要做的就是将数据框加载到字典中并生成一个。这是所有代码,它快速高效:

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

快捷方便!

于 2013-05-08T17:44:06.553 回答