如何将Pandas读取Excel生成的字典转换为适配Jinja2的VLAN结构数据
解决方案
方法1:直接通过Pandas导出目标格式(推荐)
你不需要先生成orient为dict的结构,直接调整Pandas导出参数和重命名列即可一步得到需要的结构,代码如下:
import os import pandas as pd excel_file = "File.xlsx" # 读取Excel指定列 df = pd.read_excel(os.path.join("./", excel_file), usecols="A:B,H:I") # 重命名列名匹配目标字段 df.rename(columns={ "VLAN ID": "id", "VLAN Name": "name", "Gateway": "ipaddr", "Subnet Mask": "mask" }, inplace=True) # 生成vlan列表并封装为最终结构 output = {"vlans": df.to_dict(orient="records")}
方法2:基于已有dict_data转换
如果你已经生成了问题中的dict_data结构,可以通过遍历索引转换:
vlan_total = len(dict_data["VLAN ID"]) vlan_list = [] for idx in range(vlan_total): vlan_list.append({ "id": dict_data["VLAN ID"][idx], "name": dict_data["VLAN Name"][idx], "ipaddr": dict_data["Gateway"][idx], "mask": dict_data["Subnet Mask"][idx] }) output = {"vlans": vlan_list}
Jinja2模板修正
注意你当前的模板循环逻辑有误,vlans对应的是列表而非字典,不需要调用items()方法,修正后的模板如下:
{% for vlan in vlans %} vlan {{ vlan["id"] }} name {{ vlan["name"] }} exit ! interface vlan {{ vlan["id"] }} ip address {{ vlan["ipaddr"] }} {{ vlan["mask"] }} description {{ vlan["name"] }} exit ! {% endfor %}
修正后渲染得到的结果和你预期的输出完全一致。
内容的提问来源于stack exchange,提问作者Tes3awy
相关产品推荐
相关产品推荐

