2016-10-29 5 views
0

Проблема:колонка доступа с использованием dictreader

Я возникли проблемы, пытаясь найти среднее значение столбца из файла CSV с помощью dictreader питона.

Я попытался:

Доступ столбцов, как это, используя имя столбца, это работает, но требуется имя столбца, и им не знаете, как цикл над reader.fieldnames таким образом, чтобы построить список от только каждого отдельного столбца, а не смешивания всех данных столбцов в этом же списке:

  for r in reader: 
      print(r.get("Price")) 

Пример петли

for i in reader.fieldnames: 
    for r in reader: 
     print(row.get(i)) 

Это прекрасно, однако распечатывает 1 элемент из каждого столбца для каждой строки. Это затрудняет сбор списка имен всех цен, всех имен и т. Д., Поскольку он просто перестроит диктофон в виде списка.

Вопрос

Как я могу читать только один весь столбец из dictreader, так что я могу получить доступ к каждому столбцу в отдельности в виде списка и выполнения операций на нем?

Note: до сих пор я пробовал добавлять каждый элемент с помощью цикла, но в результате получается массив размера N с 4 элементами в каждой строке.

ответ

1

Если вы отлично зацикливание над файлом один раз для каждого столбца, который вы хотите прочитать, просто построить Dict понимание списковых:

columns = {fieldname: [row.get(fieldname) for row in reader] for fieldname in reader.fieldnames} 

Там на самом деле не лучший способ сделать это, только на основе по характеру файла ... csv - это серия строк, превращая их в столбцы, которые будут немного расточительными. Вы можете возиться с этим, если вы хотите, чтобы определенные имена полей были извлечены.

Если вам действительно нужно только прочитать файл один раз, хотя:

columns = {} 
for row in reader: 
    for fieldname in reader.fieldnames: 
     columns.setdefault(fieldname, []).append(row.get(fieldname)) 
2

Вы можете использовать pandas модуль. Он очень мощный и может обрабатывать файлы csv.

import pandas as pd 
df = pd.read_csv(csv_file) 
saved_column = df['column_name'] 
+0

Полезные советы и спасибо за ответы! но им идеально не хотелось бы использовать какие-либо дополнительные библиотеки за пределами csv и т. д. – D3181

+0

'pandas' и' petl' - оба отличных варианта, если ваш набор данных имеет какой-либо существенный размер, или если требования вашего проекта начнут расти. Мой ответ был, безусловно, наивным «Программирование 101», в дикой природе вы ожидали использовать один из этих модулей. –

+0

@ToreEschliman - Если вам не нужны полные функциональные возможности Pandas DataFrame - если вы можете легко выполнить задачу с помощью встроенных встроенных функций *, возможно, не стоит добавлять посторонние модули в пространство имен. – wwii

-1
data.csv: 
''' 
one, two, three 
1,2,3 
4,5,6 
7,8,9 
10,11,12 
''' 

Используйте обычный объект читателя, получить заголовки, транспонировать данные, объединить заголовки с данными для создания Dict.

import csv 
with open('data.csv') as f: 
    reader = csv.reader(f) 
    headers = next(reader) 
    # transpose the data 
    # --> columns become rows and rows become columns 
    data = zip(*reader) 
    # create a dictionary by combining the headers with the data 
    d = dict(zip(headers, data)) 

>>> from pprint import pprint 
>>> pprint(d) 
{' three': ('3', '6', '9', '12'), 
' two': ('2', '5', '8', '11'), 
'one': ('1', '4', '7', '10')} 
>>> 
+0

Еще один нисходящий пояс без объяснения причин - не позволяет мне исправить предполагаемую ошибку. – wwii

Смежные вопросы