使用同一Jinja模板结合Pandas读Excel批量生成网络配置出错如何解决
问题根因
你使用df.to_dict(orient="dict")转换得到的是列名作为键,整列所有索引对应的值组成的字典为值的结构,渲染模板时直接传入整个结构,Jinja会把整列的字典完整输出,自然不符合预期。
修复方案
推荐修改DataFrame转字典的参数,使用orient="records"得到每行对应一个设备参数字典的列表,遍历该列表生成配置即可,无需修改Jinja模板。
修改后的main.py代码
#!usr/bin/env python3 import os from jinja2 import Environment, FileSystemLoader import pandas as pd from pprint import pprint # 读取Excel文件 df = pd.read_excel(os.path.join("./", "device-list.xlsx"), sheet_name="Test") # 转换为字典:每一行对应一个设备的所有参数,组成列表 list_data = df.to_dict(orient="records") # 统一处理所有键:空格替换为下划线、转为小写 processed_devices = [] for device in list_data: formatted_device = {key.replace(" ", "_").lower(): value for key, value in device.items()} processed_devices.append(formatted_device) # 打印处理后的数据 pprint(processed_devices) # 加载Jinja模板 env = Environment(loader=FileSystemLoader("./"), trim_blocks=True, lstrip_blocks=True) template = env.get_template("switch.j2") # 遍历每个设备生成配置 for device in processed_devices: config = template.render(device) with open(f'{device["hostname"]}.txt', "w", encoding="utf-8") as cfg_file: cfg_file.write(config) print("完成")
可选修改方式(不更改转字典参数)
如果你不想调整转字典的逻辑,也可以在原循环中按索引提取当前设备的参数再传入模板:
i = 0 while i < len(data["hostname"]): # 按索引提取当前设备的所有参数 current_device = {key: value[i] for key, value in data.items()} config = template.render(current_device) with open(f'{data["hostname"][i]}.txt', "w") as cfg_file: cfg_file.write(config) i += 1
内容的提问来源于stack exchange,提问作者Tes3awy
相关产品推荐
相关产品推荐

