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

戴夫0

我有一个这样的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对......我怎么能做到这一点?

迈克·斯科蒂

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

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'}}

注意:我只是将默认 dict 转换为 pprint 中的 dict,以便更容易看,您可以决定继续使用默认 dict。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章