You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:09:02