如何在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()
关键说明
- 保留行结构:使用
splitlines()将命令输出拆分为行列表,避免破坏原始数据结构。 - 过滤无效行:跳过空行,只处理包含有效数据的行。
- 精准提取字段:
- 温度行:拆分后取第二个字段作为传感器名称,第三个字段作为当前温度值。
- 风扇行:拆分后取第二个字段作为风扇名称,第四个字段转为整数作为转速值。
- 输出目标格式:最终生成的字典完全符合Logicmonitor监控所需的键值对结构。
内容的提问来源于stack exchange,提问作者ispnoc13
相关产品推荐
相关产品推荐

