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

如何在Python中正确解析处理输出并生成指定键值对

解决Ubiquiti EdgeSwitch环境信息解析问题

我正在编写Python脚本,通过Netmiko连接Ubiquiti EdgeSwitch获取环境信息,需要提取PHY、REAR、CPU的当前温度,以及FAN-1、FAN-2的转速,生成格式为{'PHY': '32', 'REAR': '38', 'CPU': '40', 'FAN-1': 6617, 'FAN-2': 6482}的键值对,用于Logicmonitor绘制历史监控图表。但现有脚本处理后的输出不符合预期,求指导如何正确解析输出得到目标键值对。

当前脚本

#!/usr/bin/python3

import netmiko

connection =netmiko.ConnectHandler(ip="1.2.3.4", port="22", device_type="ubiquiti_edgeswitch", username="admin", password="password", secret="password")

#defining a list to be used
output = {}

#assigning the list to the output
output = connection.send_command("show environment | exclude -- begin PHY")

#stripping all leading and trailing spaces from a list of strings
output_new = [item.replace(' ','') for item in output]

#removing any unnecessary spaces from list
while('' in output_new):
    output_new.remove('')

print(output_new)

connection.disconnect()

现有错误输出

['\n', '1', '1', 'P', 'H', 'Y', '3', '2', 'N', 'o', 'r', 'm', 'a', 'l', '4', '0', '\n', '1', '2', 'R', 'E', 'A', 'R', '3', '8', 'N', 'o', 'r', 'm', 'a', 'l', '4', '5', '\n', '1', '3', 'C', 'P', 'U', '4', '0', 'N', 'o', 'r', 'm', 'a', 'l', '4', '8', '\n', '\n', 'T', 'e', 'm', 'p', 'e', 'r', 'a', 't', 'u', 'r', 'e', 'S', 't', 'a', 't', 'u', 's', ':', 'N', 'o', 'r', 'm', 'a', 'l', '\n', '\n', 'F', 'a', 'n', 'D', 'u', 't', 'y', 'L', 'e', 'v', 'e', 'l', ':', '4', '6', '%', '\n', '\n', 'F', 'a', 'n', 's', ':', '\n', 'U', 'n', 'i', 't', 'F', 'a', 'n', 'D', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 'T', 'y', 'p', 'e', 'S', 'p', 'e', 'e', 'd', 'D', 'u', 't', 'y', 'l', 'e', 'v', 'e', 'l', 'S', 't', 'a', 't', 'e', '\n', '1', '1', 'F', 'A', 'N', '-', '1', 'F', 'i', 'x', 'e', 'd', '6', '6', '5', '0', '4', '6', '%', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'a', 'l', '\n', '1', '2', 'F', 'A', 'N', '-', '2', 'F', 'i', 'x', 'e', 'd', '6', '4', '7', '4', '4', '6', '%', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'a', 'l', '\n', '\n']

解决方案

问题分析

当前脚本错误地将命令返回的字符串拆分为单个字符列表,完全破坏了原始输出的行结构,导致无法正确提取结构化数据。正确的做法是按行处理输出,过滤无效行后,针对温度和风扇数据分别提取。

修正后的脚本

#!/usr/bin/python3

import netmiko

# 建立设备连接
connection = netmiko.ConnectHandler(
    ip="1.2.3.4",
    port="22",
    device_type="ubiquiti_edgeswitch",
    username="admin",
    password="password",
    secret="password"
)

# 获取环境信息输出并按行分割
output_lines = connection.send_command("show environment | exclude -- begin PHY").splitlines()

# 初始化结果字典
env_data = {}

# 遍历每行处理数据
for line in output_lines:
    stripped_line = line.strip()
    # 跳过空行
    if not stripped_line:
        continue
    
    # 提取温度数据(PHY/REAR/CPU行)
    if any(keyword in stripped_line for keyword in ["PHY", "REAR", "CPU"]):
        parts = stripped_line.split()
        sensor_name = parts[1]
        current_temp = parts[2]
        env_data[sensor_name] = current_temp
    
    # 提取风扇转速数据(FAN-1/FAN-2行)
    if "FAN-" in stripped_line:
        parts = stripped_line.split()
        fan_name = parts[1]
        fan_speed = int(parts[3])
        env_data[fan_name] = fan_speed

# 输出目标格式的字典
print(env_data)

# 断开连接
connection.disconnect()

关键说明

  1. 保留行结构:使用splitlines()将命令输出拆分为行列表,避免破坏原始数据结构。
  2. 过滤无效行:跳过空行,只处理包含有效数据的行。
  3. 精准提取字段:
    • 温度行:拆分后取第二个字段作为传感器名称,第三个字段作为当前温度值。
    • 风扇行:拆分后取第二个字段作为风扇名称,第四个字段转为整数作为转速值。
  4. 输出目标格式:最终生成的字典完全符合Logicmonitor监控所需的键值对结构。

内容的提问来源于stack exchange,提问作者ispnoc13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:10:37