Создание словаря из 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 ]

125 голосов
/ 19 июля 2011

Я считаю, что синтаксис, который вы искали, выглядит следующим образом:

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 вы хотите: </p>

mydict = dict((rows[0],rows[1]) for rows in reader)
56 голосов
/ 14 июля 2016

Откройте файл, вызвав open, а затем csv.DictReader.

input_file = csv.DictReader(open("coors.csv"))

Вы можете выполнять итерацию по строкам объекта для чтения диктофонов в файле csv, повторяя по input_file.

for row in input_file:
    print row

ИЛИ Для доступа только к первой строке

dictobj = csv.DictReader(open('coors.csv')).next() 
51 голосов
/ 19 июля 2011
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v
18 голосов
/ 06 декабря 2017

Это не элегантно, но однострочное решение с использованием панд.

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()
15 голосов
/ 19 июля 2011

Вы должны просто конвертировать 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'}
11 голосов
/ 23 сентября 2013

Вы также можете использовать numpy для этого.

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
4 голосов
/ 19 июля 2011

Я бы предложил добавить 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)
3 голосов
/ 06 марта 2014

Если вы согласны с использованием 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]
1 голос
/ 04 января 2018

Однострочное решение

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
1 голос
/ 10 февраля 2015

Вы можете использовать это, это довольно круто:

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
...