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)またはを使用して行を転置できます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')}
于 2013-05-08T17:14:50.350 に答える