如何从 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 中的字典,以便于阅读,您可以决定继续使用默认字典。
我有这样的 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 中的字典,以便于阅读,您可以决定继续使用默认字典。