2017-08-05 9 views
1

私はcsvファイルから階層的なdictを作成しようとしています(私が探している出力を見てください)。csvから階層辞書を作成するには?

これまでのコードはitertoolsで検索していましたが、これは私がこの作業に必要なツールだと思っています。 pandasは使用できません。多分、キーの値を新しい辞書に入れて、ポリシー・インターフェースをマップして新しいdictを作成する必要があると思いますか?

import csv 
import pprint 
from itertools import groupby 

new_dict=[] 
with open("test_.csv", "rb") as file_data: 
    reader = csv.DictReader(file_data) 

    for keys, grouping in groupby(reader, lambda x: x['groupA_policy']): 
     new_dict.append(list(grouping)) 

pprint.pprint(new_dict) 

私のcsvファイルは次のようになります。

GroupA_Host,groupA_policy,groupA_policy_interface,GroupB_Host,GroupB_policy,GroupB_policy_interface 
host1,policy10,eth0,host_R,policy90,eth9 
host1,policy10,eth0.1,host_R,policy90,eth9.1 
host2,policy20,eth2,host_Q,policy80,eth8 
host2,policy20,eth2.1,host_Q,policy80,eth8.1 

私が達成したい所望の出力がこれです:私はitertoolsはここでは必要ではないと思います

[{'GroupA_Host': 'host1', 
    'GroupB_Host': 'host_R', 
    'GroupB_policy': 'policy90', 
    'groupA_policy': 'policy10', 
    'interfaces': [{'GroupB_policy_interface': 'eth9', 
        'group_a_policy_interfaces': 'eth0'}, 
       {'GroupB_policy_interface': 'eth9.1', 
        'group_a_policy_interface': 'eth0.1'}]}, 
{'GroupA_host': 'host2', 
    'GroupB_Host': 'host_Q', 
    'GroupB_policy': 'policy80', 
    'groupA_policy': 'policy20', 
    'interfaces': [{'GroupB_policy_interface': 'eth8', 
        'groupA_policy_interfaces': 'eth2'}, 
       {'groupA_policy_interface': 'eth8.1', 
        'groupA_policy_interfaces': 'eth2.1'}]}] 

答えて

0

。重要なことは、あなたがグループ化のキーとして('GroupA_Host', 'GroupB_Host', 'groupA_policy', 'GroupB_policy')を使用していることを認識することである - ので、あなたは、このキーをキーのインターフェイス収集するために辞書を使用することができます。

d = {} 

for row in reader: 
    key = row['GroupA_Host'], row['GroupB_Host'], row['groupA_policy'], row['GroupB_policy'] 
    interface = {'groupA_policy_interface': row['groupA_policy_interface'], 
       'GroupB_policy_interface': row['GroupB_policy_interface'] 
    } 

    if key in d: 
     d[key].append(interface) 
    else: 
     d[key] = [interface] 

as_list = [] 
for key, interfaces in d.iteritems(): 
    record = {} 
    record['GroupA_Host'] = key[0] 
    record['GroupB_Host'] = key[1] 
    record['groupA_policy'] = key[2] 
    record['GroupB_policy'] = key[3] 
    record['interfaces'] = interfaces 
    as_list.append(record) 
+0

素敵な、一つの質問を。 if文を本当に必要としますか?ここでその使用法を理解しようとしています。 – zig

+0

ええ、 'd [key] = [interface]'しただけでは、リストに追加するのではなく、リストを上書きします – thomaskeefe

関連する問題