我正在寻找一种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
答案 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__
的表格对象(就像熊猫的回答一样),但这似乎适用于你的目的。