4

我正在寻找一种pythonic 和简洁的方法来选择.csv 文件中的列并将列的所有单元格存储在例如列表中。

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 行字典中获取列很简单,其他人现在可能正在写一个关于这种效果的答案,所以我不会重复这种努力,而是展示如何在我最喜欢的 Python 库之一中做到这一点数据操作,熊猫

>>> 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几天,我有自己的手工制作的库来进行这种数据访问。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
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 回答
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 回答