2017-03-05 22 views
2

からネストされた辞書を作成
file1.csv:は、私は2つのcsvファイルを持つ2つのCSVファイル

ID,map1,map2 
a,x1,x2 
b,y1, 
c,z1,z2 

file2.csv:

ID,map1Val1,map1Val2,map2Val1 
a,a1,a2,l1 
b,b1,b2, 
c,c1,c2,n1 

は、私は、出力は次のようになりたい:

{'ID': {'map1':['map1Val1','map1Val2'], 'map2':'map2Val1'},'a': {'x1':['a1','a2'], 'x2':'l1'},'b': {'y1':['b1','b2']},'c': {'z1':['c1','c2'], 'z2':'n1'},} 

私はこれを作成する方法を考えることはできません。これまでのところ私は1つのCSVファイルから辞書を作成するだけで、コードを持っている:

import csv 
new_data_dict = {} 
with open("file1.csv", 'r') as map_file: 
    mapping = csv.DictReader(map_file, delimiter=",") 
    for row in mapping: 
     new_data_dict= {row[0]:{row[1],row[2]}} 
print new_data_dict 

は出力:

{"ID":{map1,map2}, "a":{x1,x2}, "b":{y1}, "a":{z1,z2}} 

答えて

1

ここでは、file1マップから列file2から列へ-のconfigure事前ことを可能にする、より動的なソリューションです:csv.DictReaderの使用は、私たちにマップをすることができます

import csv 

= {'map1': ['map1Val1', 'map1Val2'], 
       'map2': ['map2Val1'] 
       } 

joined_data = dict() 
joined_data['ID'] = column_map 

with open("file1.txt") as f1, open("file2.txt") as f2: 
    key_list = list(csv.DictReader(f1)) 
    value_list = list(csv.DictReader(f2)) 

for kl, vl in zip(key_list, value_list): 
    inner = {} 
    for key, value_list in column_map.items(): 
     if kl[key]: 
      inner[kl[key]] = [vl[el] for el in value_list] 

    joined_data[kl['ID']] = inner 

は、各行のデータはdictになります。そのキーは(デフォルトでは)ファイルの最初の行で指定されます。 2つのDictReaderオブジェクトはリストにキャストされ、zipを使用して反復されます。 column_mapを目安にして、の辞書に新しいinner辞書を作成し、key_listのキーにvalue_listという値を関連付けます。完全に動的なソリューションについては

EDIT

、あなたは答えのためにfile2

import csv 
from collections import defaultdict 

joined_data = dict() 
column_map = defaultdict(list) 

with open("file1.txt") as f1, open("file2.txt") as f2: 
    kh = next(f1).strip() 
    vh = next(f2).strip() 
    key_headers = kh.split(',') 
    value_headers = vh.split(',') 

    [column_map[k].append(v) for k in key_headers[1:] for v in value_headers[1:] if v.startswith(k)] 
    joined_data['ID'] = dict(column_map) 

    key_list = list(csv.DictReader(f1, fieldnames=key_headers)) 
    value_list = list(csv.DictReader(f2, fieldnames=value_headers)) 

for kl, vl in zip(key_list, value_list): 
    inner = {} 
    for key, value_list in column_map.items(): 
     if kl[key]: 
      inner[kl[key]] = [vl[el] for el in value_list] 

    joined_data[kl['ID']] = inner 
1

次の2つのcsvファイルから行を集約するzipを使用することができます。

>>> list(zip([1,2,3], [4,5,6])) # assume 1, 2, 3/4, 5, 6 as row values 
[(1, 4), (2, 5), (3, 6)] 

import csv 

new_data_dict = {} 
with open('file1.csv') as f1, open('file2.csv') as f2: 
    reader1, reader2 = csv.reader(f1), csv.reader(f2) 
    for row1, row2 in zip(reader1, reader2): 
     id_, map1, map2 = row1 
     new_data_dict[id_] = {map1: row2[1:3]} 
     map2 = map2.strip() 
     if map2: # put map2 only if map2 key exists 
      new_data_dict[id_][map2] = row2[3] 

new_data_dictは次のようになります。

{'ID': {'map1': ['map1Val1', 'map1Val2'], 'map2': 'map2Val2'}, 
'a': {'x1': ['a1', 'a2'], 'x2': 'l1'}, 
'b': {'y1': ['b1', 'b2']}, 
'c': {'z1': ['c1', 'c2'], 'z2 ': 'n1'}} 
+0

おかげからのものでfile1から列ヘッダーを比較することによって、その場でcolumn_mapを作成することができます。私は@ waterboy5281の答えがより好きです。なぜなら、よりダイナミックなのでです。 –

関連する問題