私はCSVファイルから辞書を作成しようとしています。 csvファイルの最初の列には一意のキーが含まれ、2番目の列には値が含まれています。 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)
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()
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
k, v = row
d[k] = v
これはエレガントではありませんが、パンダを使用した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()
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'}
あなたはこれにもnumpyを使うことができます。
from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
ファイルの最後に空行がある場合に備えて、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()}
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]}
次のような単純な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)})
多くのソリューションが投稿されており、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])