Создание словаря из файла 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? Спасибо.

777   10  

10 ответов:

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

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

mydict = dict((rows[0],rows[1]) for rows in reader)
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v

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

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

вы можете перебирать строки csv-файла dict reader объекта путем перебора input_file.

for row in input_file:
    print row

или Чтобы получить доступ только к первой строке

dictobj = csv.DictReader(open('coors.csv')).next() 

вы должны просто конвертировать csv.читатель диктует:

~ >> 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'}

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

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }

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

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()

Я бы предложил добавить 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)

Если вы в порядке с использованием пакета 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]

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

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

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

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}

Comments

    Ничего не найдено.