Python如何从CSV文件创建设备接口VLAN映射嵌套字典
问题原因
你的代码出现覆盖问题的核心原因很简单:每次循环匹配到同一设备的行时,你都直接给d[row['device']]赋值了一个全新的单键字典,之前存储在这个键下的其他接口映射会被直接替换,最终只会保留每台设备最后一次遍历到的接口-VLAN对。
修复方案
不要直接替换设备对应的整个二级字典,而是在遇到设备条目时:
- 先检查一级字典里是否已经存在当前设备的键,不存在就先初始化一个空字典作为值
- 再往这个设备对应的二级字典里,单独新增当前接口和VLAN的键值对,不会影响已经存在的其他接口条目
基础实现代码
import csv d = {} with open("interfaces.csv", encoding="utf-8") as f: csv_reader = csv.DictReader(f) for row in csv_reader: dev = row["device"] # 设备首次出现时初始化空的接口映射字典 if dev not in d: d[dev] = {} # 追加单条接口-VLAN映射,不覆盖原有内容 d[dev][row["interface"]] = row["vlan"]
运行后得到的字典结构完全符合你的预期:
{ "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"} }
简化写法(可选)
如果想省略手动判断key是否存在的步骤,可以用标准库collections中的defaultdict,它会自动给不存在的一级键初始化空字典:
import csv from collections import defaultdict d = defaultdict(dict) with open("interfaces.csv", encoding="utf-8") as f: csv_reader = csv.DictReader(f) for row in csv_reader: d[row["device"]][row["interface"]] = row["vlan"] # 需要原生普通字典的话,加一行转换即可 d = dict(d)
内容的提问来源于stack exchange,提问作者Dave0
相关产品推荐
相关产品推荐

