
本文介绍如何使用 python 读取空格分隔的 csv 文件中的 ip 地址,格式化为带端口和引号的字符串列表,并精准替换目标配置文件(如 `routers.conf`)的第 2 行内容,适用于 telegraf snmp 监控等自动化运维场景。
在日常运维中,常需将数据库导出的 IP 列表动态注入到监控配置文件中。本方案针对一个典型场景:源文件 ip.csv 仅含一行,IP 地址以空格分隔(如 192.168.0.1 192.168.0.2),目标文件 routers.conf 是 Telegraf 的 SNMP 输入配置,要求将格式化后的 IP 列表(如 "192.168.0.1:161","192.168.0.2:161")精确写入其第 2 行(即 agents [...] 所在行),覆盖原有内容。
以下是完整、健壮的 Python 实现:
import csv
# 1. 读取 CSV 中的 IP 地址(注意:空格分隔,且仅首行有效)
with open("ip.csv", "r", encoding="utf-8-sig") as infile:
reader = csv.reader(infile, delimiter=" ")
try:
ip_addresses = next(reader)
except StopIteration:
raise ValueError("CSV 文件为空,未读取到任何 IP 地址")
# 2. 格式化每个 IP:添加双引号 + ":161" 后缀
formatted_ips = [f'"{ip.strip()}:161"' for ip in ip_addresses if ip.strip()]
# 3. 拼接为合法的 TOML/配置风格字符串(注意等号与空格)
ip_string = ", ".join(formatted_ips)
agents_line = f' agents = [{ip_string}]'
# 4. 读取原始配置文件,确保至少有 2 行
with open("routers.conf", "r") as file:
lines = file.readlines()
if len(lines) < 2:
raise ValueError("routers.conf 文件至少需要 2 行才能替换第 2 行(索引为 1)")
# 5. 替换第 2 行(索引 1),保留原始缩进与换行符
lines[1] = agents_line + "\n"
# 6. 写回文件(覆盖原文件)
with open("routers.conf", "w") as file:
file.writelines(lines)
print(f"✅ 成功更新 routers.conf:共写入 {len(formatted_ips)} 个代理地址")关键注意事项:
- ✅ 空格分隔处理:使用 csv.reader(..., delimiter=" ") 正确解析空格分隔字段;配合 ip.strip() 防止前后空格干扰;
- ✅ 安全校验:增加 try/except 和 if ip.strip() 过滤空项,避免生成无效配置(如 "" 或 ":161");
- ✅ 行定位精准性:明确使用 lines[1] 替换第 2 行(Python 索引从 0 开始),不依赖正则匹配,稳定可靠;
- ✅ 格式兼容性:输出严格遵循示例中的缩进(4 个空格)和等号语法(agents = [...]),适配 Telegraf 的 TOML 解析器;
- ⚠️ 备份建议:生产环境运行前,建议先备份 routers.conf,例如:
cp routers.conf routers.conf.bak.$(date +%s)
该脚本可轻松集成至 cron 定时任务(如每日凌晨执行),实现 SQL 导出 → CSV → 配置热更新的全自动闭环。
立即学习“Python免费学习笔记(深入)”;










