2013-11-25 4 views
0

Так у меня есть несколько файлов CSV в в следующем формате:Преобразование CSV-таблицы в словаре

person,age,nationality,language 
Jack,18,Canadian,English 
Rahul,25,Indian,Hindi 
Mark,50,American,English 
Kyou, 21, Japanese, English 

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

dict = { 
    'person': ['Jack', 'Rahul', 'Mark', 'Kyou'], 
    'age': [18, 25, 50, 21], 
    'nationality': ['Canadian', 'Indian', 'American', 'Japanese'], 
    'language': ['English', 'Hindi', 'English', 'English'] 
} 

Любая идея, как я хотел бы начать этот код и сделать это так, что код будет работать для любого количества столбцов, заданных в файле .csv?

+0

Посмотрите на модуль 'csv'. Особенно 'DictReader'. Это должно позволить вам получить '[{'person': 'jack', 'age': '18', ...}, ...]'. Оттуда это простое преобразование, чтобы получить то, что вы хотите. – mgilson

+0

Модуль 'csv' позволяет преобразовать его в' list' 'dicts'. – RyPeck

+0

Мне нужно выводить результат как словарь, но не список. – user3033494

ответ

1

Вот довольно простое решение, которое использует питона CSV модуль (DOCs здесь: http://docs.python.org/2/library/csv.html). Просто замените 'csv_data.csv' на имя вашего CSV-файла.

import csv 

with open('csv_data.csv') as csv_data: 
    reader = csv.reader(csv_data) 

    # eliminate blank rows if they exist 
    rows = [row for row in reader if row] 
    headings = rows[0] # get headings 

    person_info = {} 
    for row in rows[1:]: 
     # append the dataitem to the end of the dictionary entry 
     # set the default value of [] if this key has not been seen 
     for col_header, data_column in zip(headings, row): 
      person_info.setdefault(col_header, []).append(data_column) 

    print person_info 
2

Используя модуль CSV, я хотел бы сделать это следующим образом:

with open('somefile.csv', 'rb') as input_file: 
    reader = csv.DictReader(input_file) 
    results = {} 
    for linedict in reader: 
     for (key, value) in linedict.iteritems(): 
      results.setdefault(key, []).append(value) 
3

я бы что-то вроде:

import csv 

with open('input') as fin: 
    csvin = csv.reader(fin) 
    header = next(csvin, []) 
    print dict(zip(header, zip(*csvin))) 

# {'person': ('Jack', 'Rahul', 'Mark', 'Kyou'), 'age': ('18', '25', '50', ' 21'), 'language': ('English', 'Hindi', 'English', ' English'), 'nationality': ('Canadian', 'Indian', 'American', ' Japanese')} 

Адаптировать соответственно.

+0

Это красиво и лаконично. Единственное, на что нужно обратить внимание, это то, что это сломается на рваных строках - то есть, если какой-либо опустить «язык» и конечную запятую после «национальности». экземпляры 'reader' не заполняют недостающие поля, а' zip' усекает до кратчайшей последовательности. Независимо от того, действительно ли это связано с ситуацией. –

0

Вы можете использовать zipping в сочетании с нарезкой в ​​понимании dict, как только вы включили данные в список списков с модулем csv.

{col[0] : col[1:] for col in zip(*rows)} 
Смежные вопросы