Python netmiko批量采集思科设备导出CSV分列存放问题求助
思科设备批量采集脚本CSV输出修复方案
核心问题原因
你遇到的输出挤在同一单元格/列错位问题,是因为netmiko返回的命令结果自带大量换行符,且未对CSV输出做特殊字符防护,Excel/表格工具解析时误把字段内的换行识别为行分隔符导致的。
必改调整点
- 清洗主机名字段:提取
show run | include hostname返回结果中的真实主机名,移除前缀和首尾空白/换行 - 开启CSV字段强制引号包裹:避免字段内的换行、逗号等特殊字符破坏表格结构
- 修复原代码中
Connection.disconnect未加括号的bug,避免连接残留 - 移除重复导入的依赖包,优化代码冗余
- 新增CSV写操作的
newline参数,避免Windows系统下输出文件出现多余空行
修改后完整代码
import netmiko import csv from datetime import datetime nodenum = 1 # 读取设备IP列表 with open('routers.csv', 'r', encoding='utf-8') as f: file_as_list = f.read().splitlines() # 输出文件配置,指定QUOTE_ALL强制所有字段用双引号包裹,避免特殊字符错位 with open('Output.csv', 'w', encoding='utf-8', newline='') as f: write = csv.writer(f, quoting=csv.QUOTE_ALL) write.writerow(['Hostname', 'Cellular']) # 错误日志配置 with open("error.csv", "a", encoding='utf-8', newline='') as logf: loga = csv.writer(logf) loga.writerow(["Hostname"]) for ip in file_as_list: print(f"Node {nodenum} ...Checking IP Address... {ip}") Connection = None # 先尝试SSH连接 try: Connection = netmiko.ConnectHandler( ip=ip, device_type="cisco_ios", username="x", password="y", verbose=False ) except: # SSH失败尝试Telnet连接 try: print("Cannot connect via SSH. Trying Telnet") Connection = netmiko.ConnectHandler( ip=ip, device_type="cisco_ios_telnet", username="x", password="y", verbose=False ) except: print("SSH and Telnet Failed\n") loga.writerow([ip]) nodenum += 1 continue # 提取并清洗主机名,去除多余前缀和空白符 hostname_raw = Connection.send_command("show run | include hostname").strip() hostname = hostname_raw.split()[-1] if len(hostname_raw.split())>1 else ip # 执行接口查询命令 cellular = Connection.send_command("sh ip int brief").strip() # 主动断开连接 Connection.disconnect() # 写入CSV,自动对应A列主机名、B列命令输出 write.writerow([hostname, cellular]) nodenum += 1
效果说明
修改后打开Output.csv时,第一列固定为主机名,第二列为对应设备的sh ip int brief完整输出,不会出现列错位、内容挤在同一单元格的问题。
内容的提问来源于stack exchange,提问作者JOD
相关产品推荐
相关产品推荐

