如何从 CSV 文件创建嵌套字典?

How to create nested dict from CSV file?

我有这样的 csv:

device,interface,vlan
switch1,ge-0/0/11,vlan1
switch1,ge-0/0/12,vlan1
switch2,ge-0/0/13,vlan10
switch2,ge-0/0/14,vlan20
switch3,ge-0/0/15,vlan1
switch4,ge-0/0/16,vlan12
switch5,ge-0/0/17,vlan11

我想将其转换成一个嵌套的字典,其中开关名称作为第一个键,接口作为附加键..所以例如 switch1 看起来像这样:

d = {"switch1":{'ge-0/0/11':"vlan1",'ge-0/0/12':"vlan1"}}

使用这段代码我不知道如何让每个接口都有自己的密钥:

In [126]: with open("interfaces.csv") as f:
     ...:     csvfile = csv.DictReader(f)
     ...:     for row in csvfile:
     ...:         d[row['device']] = {row['interface']:row['vlan']}
     ...:

In [127]: d
Out[127]:
{'switch1': {'ge-0/0/12': 'vlan1'},
 'switch2': {'ge-0/0/14': 'vlan20'},
 'switch3': {'ge-0/0/15': 'vlan1'},
 'switch4': {'ge-0/0/16': 'vlan12'},
 'switch5': {'ge-0/0/17': 'vlan11'}}

所以它只使用最后一个接口,它循环通过的 vlan 对...我怎样才能做到这一点?

您目前正在每次迭代期间覆盖该值,而不是向您的字典添加新的键+值对。您可以使用默认字典轻松实现此目的,因此如果它尚不存在,您不必自己创建新字典。

from io import StringIO
from collections import defaultdict
import pprint
import csv

txt = """device,interface,vlan
switch1,ge-0/0/11,vlan1
switch1,ge-0/0/12,vlan1
switch2,ge-0/0/13,vlan10
switch2,ge-0/0/14,vlan20
switch3,ge-0/0/15,vlan1
switch4,ge-0/0/16,vlan12
switch5,ge-0/0/17,vlan11"""

d = defaultdict(dict)
with StringIO(txt) as f:
    csvfile = csv.DictReader(f)
    for row in csvfile:
        d[row['device']][row['interface']]=row['vlan']

pprint.pprint(dict(d))

输出:

{'switch1': {'ge-0/0/11': 'vlan1', 'ge-0/0/12': 'vlan1'},  
 'switch2': {'ge-0/0/13': 'vlan10', 'ge-0/0/14': 'vlan20'},
 'switch3': {'ge-0/0/15': 'vlan1'},
 'switch4': {'ge-0/0/16': 'vlan12'},
 'switch5': {'ge-0/0/17': 'vlan11'}}

注意:我只是将默认字典强制转换为 pprint 中的字典,以便于阅读,您可以决定继续使用默认字典。