2013-02-11 45 views
4

我正在尋找pythonic和簡潔的方式來選擇.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 
+0

可能的重複:http://stackoverflow.com/questions/5741518/reading-each-column-from-csv-file – 2013-02-11 16:25:17

+0

什麼,除了循環閱讀器,只是通過它的列名挑出每列? '對於閱讀器中的行:print row ['foo']'? – 2013-02-11 16:25:27

+0

@MartijnPieters也許這已經在某個地方實現了,還有其他工具可以按列處理CSV數據。 – clstaudt 2013-02-11 16:26:41

回答

5

它的簡單讓列了DictReader行類型的字典的純Python,而別人可能是寫一個答案,那效果,現在,因此,我將展示如何在我最喜歡的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幾年前大約十五分鐘後,我扔了吧..

+0

我非常喜歡熊貓,但增加另一個依賴並不總是最受歡迎的解決方案。話雖如此,如果OP打算做更多的數據分析,使用Pandas可能會節省很多痛苦。 – EML 2013-02-11 19:01:35

+0

我打算進行更多的數據分析,我過去曾經使用過R,所以Pandas可能就是解決方案。 – clstaudt 2013-02-11 20:22:36

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 
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. 
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的答案一樣),但是這似乎適用於你的目的。