Создание словаря из файла csv?
Я пытаюсь создать словарь из файла 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? Спасибо.
Ответы
Ответ 1
Я считаю, что синтаксис, который вы искали, выглядит следующим образом:
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)
mydict = {rows[0]:rows[1] for rows in reader}
В качестве альтернативы для python <= 2.7.1 вы хотите:
mydict = dict((rows[0],rows[1]) for rows in reader)
Ответ 2
Откройте файл, вызвав open, а затем csv.DictReader
.
input_file = csv.DictReader(open("coors.csv"))
Вы можете выполнять итерацию по строкам объекта чтения данных csv file dict путем итерации по input_file.
for row in input_file:
print row
ИЛИ Для доступа только к первой строке
dictobj = csv.DictReader(open('coors.csv')).next()
Ответ 3
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
k, v = row
d[k] = v
Ответ 4
Это не элегантно, а однолинейное решение с использованием панд.
import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()
Если вы хотите указать dtype для вашего индекса (он не может быть указан в read_csv, если вы используете аргумент index_col из-за ошибки):
import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
Ответ 5
Вам нужно просто преобразовать csv.reader в dict:
~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3
~ >> cat > d.py
import csv
with open('1.csv') as f:
d = dict(filter(None, csv.reader(f)))
print(d)
~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}
Ответ 6
Вы также можете использовать numpy для этого.
from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
Ответ 7
Я бы предложил добавить if rows
в случае, если в конце файла есть пустая строка
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)
mydict = dict(row[:2] for row in reader if row)
Ответ 8
Если у вас все в порядке с использованием пакета numpy, вы можете сделать что-то вроде следующего:
import numpy as np
lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
my_dict[lines[i][0]] = lines[i][1]
Ответ 9
Вы можете использовать это, это довольно круто:
import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
records, metadata = commas.parse(f)
for row in records:
print 'this is row in dictionary:'+rowenter code here
Ответ 10
Однострочное решение
import pandas as pd
dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
Ответ 11
Попробуйте использовать 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]}
Ответ 12
Было опубликовано много решений, и я хотел бы поделиться с моим, который работает для другого числа столбцов в файле 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])
Ответ 13
Для простых файлов 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)})