web-dev-qa-db-ja.com

CSVファイルから辞書を作成する?

私はCSVファイルから辞書を作成しようとしています。 csvファイルの最初の列には一意のキーが含まれ、2番目の列には値が含まれています。 csvファイルの各行は、辞書内の一意のキーと値のペアを表します。私は csv.DictReadercsv.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つの辞書を作成する方法ありがとう。

111
drbunsen

私はあなたが探していた構文は以下の通りだと思います:

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)
125
Nate

Openを呼び出してからcsv.DictReaderを呼び出してファイルを開きます。

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

Input_fileを反復することで、csvファイルの辞書リーダーオブジェクトの行を反復することができます。

for row in input_file:
    print row

または最初の行だけにアクセスする

dictobj = csv.DictReader(open('coors.csv')).next() 
54
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v
50
robert

これはエレガントではありませんが、パンダを使用した1行のソリューションです。

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

インデックスにdtypeを指定したい場合( バグ のためにindex_col引数を使用する場合はread_csvに指定できません)。

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
17
mudassirkhan19

Csv.readerを辞書に変換するだけです。

~ >> 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'}
15
Alex Laskin

あなたはこれにもnumpyを使うことができます。

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

ファイルの最後に空行がある場合に備えて、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)
4
John La Rooy

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]
3
cloudyBlues

あなたはこれを使うことができます、それはかなりクールです:

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
1
hamed

ワンライナーソリューション

import pandas as pd

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

defaultdictDictReaderを使用してみてください。

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]}
0

次のような単純な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
yellow01

多くのソリューションが投稿されており、CSVファイルの異なる列数で機能する私のものに貢献したいと思います。列ごとに1つのキーを持つディクショナリを作成し、各キーの値は、そのような列の要素を含むリストです。

    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