Pythonic从CSV文件复制列的方法

时间:2013-02-11 16:24:12

标签: python csv python-3.x import-from-csv

我正在寻找一种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 个答案:

答案 0 :(得分:5)

在纯Python中直接从DictReader行dicts中获取列,并且其他人可能现在正在写这个效果的答案,所以不是重复这些努力,我将在我最喜欢的一个中展示如何做到这一点用于数据操作的Python库pandas

>>> 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大约十五分钟后,我把它扔了..

答案 1 :(得分: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.

答案 2 :(得分: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

答案 3 :(得分: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__的表格对象(就像熊猫的回答一样),但这似乎适用于你的目的。