使用Python比对两个CSV文件并填充目标CSV空列的实现方案
双CSV安全组配置批量填充实现方案
前置依赖
- 需安装pandas处理CSV文件:
pip install pandas - IP网段校验使用Python标准库
ipaddress,无需额外安装
核心实现规则
完全匹配需求给定的处理逻辑:
- DR_sec_grp列填充:
- 特殊映射:Net-prod-DB2 直接对应为 Net-DR-DB1
- 其余Prod_sec_grp值直接将字符串中的
prod替换为DR即可
- Subnet与dr_subnet列填充:
- 遍历待处理表的
src/dest IP字段,与子网信息表的Subnet IP网段逐一匹配 - 匹配成功:对应生产子网名填入Subnet列,生产子网名按上述映射规则转换后填入dr_subnet列
- 匹配失败:直接将
src/dest IP的取值同时填入Subnet与dr_subnet列
- 遍历待处理表的
完整Python代码
import pandas as pd import ipaddress # 1. 读取两份CSV文件,替换为你的实际文件路径 subnet_df = pd.read_csv("subnet_info.csv") # 第一份:ID、Subnet、Subnet IP sg_df = pd.read_csv("security_group.csv") # 第二份:待处理的安全组配置表 # 2. 预处理子网信息,生成可直接匹配的网段对象列表 subnet_list = [] for _, row in subnet_df.iterrows(): try: net = ipaddress.IPv4Network(row["Subnet IP"], strict=False) subnet_list.append((net, row["Subnet"])) except Exception as e: print(f"非法网段跳过:{row['Subnet IP']}, 错误信息:{e}") # 3. 填充DR_sec_grp列 def get_dr_sg(prod_sg): if prod_sg == "Net-prod-DB2": return "Net-DR-DB1" return prod_sg.replace("prod", "DR") sg_df["DR_sec_grp"] = sg_df["Prod_sec_grp"].apply(get_dr_sg) # 4. 填充Subnet与dr_subnet列 def match_subnet(ip_str): try: ip = ipaddress.IPv4Address(ip_str) except Exception as e: # IP格式非法直接返回原值 return ip_str, ip_str # 匹配网段 for net, prod_subnet_name in subnet_list: if ip in net: # 生成对应灾备子网名 if prod_subnet_name == "Net-prod-DB2": dr_subnet_name = "Net-DR-DB1" else: dr_subnet_name = prod_subnet_name.replace("prod", "DR") return prod_subnet_name, dr_subnet_name # 未匹配到网段返回原值 return ip_str, ip_str # 拆分返回值到两列 sg_df[["Subnet", "dr_subnet"]] = sg_df["src/dest IP"].apply( lambda x: pd.Series(match_subnet(x)) ) # 5. 导出结果到新CSV,避免覆盖原文件 sg_df.to_csv("filled_security_group.csv", index=False, encoding="utf-8-sig") print("处理完成,结果已保存为 filled_security_group.csv")
验证注意事项
- 若存在重叠网段,可提前对
subnet_list按子网掩码长度降序排序,优先匹配最长掩码的更精准网段 - 需要支持IPv6的话,将代码中
IPv4Address/IPv4Network替换为ipaddress.ip_address/ipaddress.ip_network即可自动兼容 - 输出文件使用
utf-8-sig编码,避免Excel打开出现中文乱码
内容的提问来源于stack exchange,提问作者Jijin Shaji
相关产品推荐
相关产品推荐

