Maximo环境Jython2.7.1无额外依赖存储可读类表格数据咨询
问题描述
我使用的商用现货(COTS)系统为IBM Maximo Asset Management 7.6.1.2,支持编写Python脚本,该系统存在如下限制:
- Python版本为2.7.1,实际是Jython而非原生Python
- 无法导入第三方Python库,仅能使用部分标准库
- 无法在服务器存储CSV、文本等文件
- 无法在数据库中创建自定义表
我需要在Python脚本中存储如下类表格数据,后续将编写Python函数实现类似数据库表的数据查询能力:
表名:DIVISION_SETTINGS DIVISION FLOW_CONTROL_REQ ACTUAL_COSTS_REQ SETTING3 SETTING4 SETTING5 FLEET 1 1 0 1 A ROADS 0 1 0 2 B PARKS 0 1 1 3 C DIV4 1 0 0 4 D DIV5 0 0 0 5 E DIV6 0 1 1 6 F DIV7 0 1 0 7 G
我查阅Python文档后发现列表、collections等内置结构存储的数据可读性较差,希望采用人类易读的列式格式存储数据,方便IT人员直接在脚本中修改值、降低出错概率。
请问在不额外引入库、不使用文件、不使用数据库表的前提下,Python 2.7.1中有没有实现上述需求的方案?
可行实现方案
以下两种方案均完全基于Python 2.7内置语法实现,无需引入第三方库、无需读写文件、无需操作自定义数据表,同时满足高可读性要求。
方案1:硬编码类表格字符串+极简解析(最推荐,修改成本最低)
直接在脚本中写入和原生表格格式完全一致的多行字符串,运维人员修改配置时无需了解Python数据结构,直接对齐修改数值即可。
# 配置表格直接按原生格式写,可读性拉满,修改时直接改对应位置的值即可 DIVISION_SETTINGS_RAW = ''' DIVISION FLOW_CONTROL_REQ ACTUAL_COSTS_REQ SETTING3 SETTING4 SETTING5 FLEET 1 1 0 1 A ROADS 0 1 0 2 B PARKS 0 1 1 3 C DIV4 1 0 0 4 D DIV5 0 0 0 5 E DIV6 0 1 1 6 F DIV7 0 1 0 7 G ''' # 极简解析逻辑,仅用内置字符串操作,无需依赖任何标准库 def parse_table(raw_str): lines = [line.strip() for line in raw_str.split('\n') if line.strip()] # 第一行是字段名 fields = lines[0].split() # 后续行是数据 table_data = [] for line in lines[1:]: values = line.split() # 可根据需要自行转换字段类型,比如数字转int row = dict(zip(fields, values)) row['FLOW_CONTROL_REQ'] = int(row['FLOW_CONTROL_REQ']) row['ACTUAL_COSTS_REQ'] = int(row['ACTUAL_COSTS_REQ']) row['SETTING3'] = int(row['SETTING3']) row['SETTING4'] = int(row['SETTING4']) table_data.append(row) return table_data DIVISION_SETTINGS = parse_table(DIVISION_SETTINGS_RAW) # 查询示例:按部门查配置 def get_setting_by_division(division): for row in DIVISION_SETTINGS: if row['DIVISION'] == division: return row return None # 查询示例:按多条件筛选 def filter_settings(**conditions): result = [] for row in DIVISION_SETTINGS: match = True for k, v in conditions.items(): if row.get(k) != v: match = False break if match: result.append(row) return result
方案2:namedtuple结构化存储(无解析逻辑,直接使用)
如果不需要频繁修改配置,可使用Python 2.7标准库自带的collections.namedtuple实现结构化存储,字段含义一目了然:
from collections import namedtuple # 定义行结构 DivisionSetting = namedtuple('DivisionSetting', ['DIVISION', 'FLOW_CONTROL_REQ', 'ACTUAL_COSTS_REQ', 'SETTING3', 'SETTING4', 'SETTING5']) DIVISION_SETTINGS = [ DivisionSetting('FLEET', 1, 1, 0, 1, 'A'), DivisionSetting('ROADS', 0, 1, 0, 2, 'B'), DivisionSetting('PARKS', 0, 1, 1, 3, 'C'), DivisionSetting('DIV4', 1, 0, 0, 4, 'D'), DivisionSetting('DIV5', 0, 0, 0, 5, 'E'), DivisionSetting('DIV6', 0, 1, 1, 6, 'F'), DivisionSetting('DIV7', 0, 1, 0, 7, 'G'), ] # 查询时可直接通过属性取值,比如row.FLOW_CONTROL_REQ
两种方案都兼容Jython 2.7.1运行环境,适配Maximo系统的所有限制要求。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

