4

.csv ファイルで列を選択し、列のすべてのセルをリストなどに保存するための Pythonic で簡潔な方法を探しています。

import csv    

with open("/path/to/file.csv","r") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=";")
    # TODO: select column for key "foo"
    # TODO: select column for key "bar"
    # TODO:store "foo" data in list
    # TODO: store "bar" data in list
4

4 に答える 4

5

純粋な Python で DictReader の行 dict から列を取得するのは簡単で、おそらく他の誰かがその効果に対する答えを今書いているので、その努力を複製する代わりに、私のお気に入りの Python ライブラリの 1 つでこれを行う方法を示します。データ操作、パンダ:

>>> import pandas as pd
>>> df = pd.read_csv("somefile.csv", sep=";")
>>> df
   foo  bar      apple
0    1  100       pear
1    2  200     orange
2    3  300  tangerine
3    4  400      peach
>>> df["foo"]
0    1
1    2
2    3
3    4
Name: foo
>>> df["bar"]
0    100
1    200
2    300
3    400
Name: bar
>>> df["foo"] * df["bar"]
0     100
1     400
2     900
3    1600
>>> list(df["foo"] * df["bar"])
[100, 400, 900, 1600]

暗いpandas時代、私はこの種のデータ アクセス用に手作りのライブラリを持っていました。数年前に約15分後、pandas私はそれを投げました..

于 2013-02-11T16:40:31.107 に答える
2

ファイル内の各列に個別にアクセスする場合は、列データをcsv 一度収集してループするのが最も効率的です。

import defaultdict
import csv

columns = defaultdict(list)

with open("/path/to/file.csv","r") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=";")
    for row in reader:
        for key, value in row.iteritems():
            defaultdict[key] = value

これcolumnsは、列ごとにリストを持つ辞書です。

for value in columns['foo']:
    # do something with the `foo` column
# etc.
于 2013-02-11T18:21:51.330 に答える
1
import csv

def col_selector(table, column_key):
    return [row[column_key] for row in table]

with open("/path/to/file.csv","r") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=";")
    table = [row for row in reader]
    foo_col = col_selector(table, "foo")
    bar_col = col_selector(table, "bar")

これは、別の関数でリスト内包表記を使用して行う簡単な方法です。もちろん、少し凝ったものにして、__getitem__実装されたテーブルオブジェクトを作成することもできます(Pandasの回答のように)が、これはあなたの目的には役立つようです。

于 2013-02-11T18:58:08.940 に答える
1
bash-3.2$ cat tcsv.py
import csv
def get_col(filename, col=0):
    for row in csv.reader(open(filename), delimiter=';'):
        yield row[col]
print list(get_col("tar.data"))

bash-3.2$ python tcsv.py
['1.0', '4.7', '4.7']

bash-3.2$ cat tar.data
1.0;2.3;4.5;512
4.7;9.2;6.7;240
4.7;1.8;4.3;912
于 2013-02-11T16:38:00.173 に答える