2013-02-11 6 views
4

Я ищу питоновую и краткую возможность выбрать столбец в 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 –

+0

Что, кроме циклического чтения «читателя» и просто выбора каждого столбца по имени его столбца? 'for row in reader: print row ['foo']'? –

+0

@MartijnPieters Возможно, это уже реализовано где-то вместе с другими инструментами для обработки CSV-данных по столбцам. – clstaudt

ответ

5

Это просто, чтобы получить столбцы из DictReader строк dicts в чистом 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

Мне очень нравится Pandas, но добавление еще одной зависимости не всегда является самым желанным решением. При этом, если ОП намеревается сделать гораздо больше анализа данных, использование Pandas, вероятно, сэкономит много боли. – EML

+0

Я намерен сделать больше анализа данных, для которых я использовал R в прошлом, поэтому Pandas может быть просто решением. – clstaudt

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), но это, похоже, работает для ваших целей.