Создание словаря из CSV-файла? - PullRequest
114 голосов
/ 19 июля 2011

Я пытаюсь создать словарь из файла CSV. Первый столбец файла csv содержит уникальные ключи, а второй столбец содержит значения. Каждая строка файла CSV представляет собой уникальный ключ, пару значений в словаре. Я пытался использовать классы csv.DictReader и csv.DictWriter, но я мог только выяснить, как создать новый словарь для каждой строки. Я хочу один словарь. Вот код, который я пытаюсь использовать:

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v for k, v in rows}
    print(mydict)

Когда я запускаю приведенный выше код, я получаю ValueError: too many values to unpack (expected 2). Как мне создать один словарь из файла CSV? Спасибо.

Ответы [ 13 ]

0 голосов
/ 17 июля 2019

Для простых файлов CSV, таких как следующие

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

Вы можете преобразовать его в словарь Python, используя только встроенные модули

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in zip(header, values)}

Это должно привести к следующему словарю

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

Примечание: словари Python имеют уникальные ключи, поэтому если в вашем csv-файле есть дубликат ids, вам следует добавить каждую строку в список.

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in zip(header, values)})
0 голосов
/ 08 июля 2019

Было опубликовано много решений, и я хотел бы поделиться с моим, который работает для другого числа столбцов в файле CSV.Он создает словарь с одним ключом на столбец, а значением для каждого ключа является список с элементами в этом столбце.

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])
0 голосов
/ 18 июня 2019

Попробуйте использовать defaultdict и DictReader.

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

Возвращает:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}
...