如何用Python展开含索引命名键的JSON数据为结构化表格
问题与解决方案
问题描述
输入的非规范结构化数据:
id,hardware_json 1,{hardware[0]_id:123,hardware[0]_name:ModelA,hardware[0]_type:M,hardware[1]_id:345,hardware[1]_name:ModelB,hardware[1]_type:N,hardware[0]_vendor:cnfd....}
需要转换为每行对应一个硬件的结构化格式:
Id,hardware_id,hardware_name,hardware_type,hardware_vendor 1,123,ModelA,M 1,345,ModelB,N,cnfd
同时需了解Python是否有内置JSON处理函数可实现该需求。
代码实现
原始的hardware_json并非标准JSON格式,需先做字符串预处理,再结合Python内置模块完成转换:
import json import re # 模拟输入数据 input_data = """id,hardware_json 1,{hardware[0]_id:123,hardware[0]_name:ModelA,hardware[0]_type:M,hardware[1]_id:345,hardware[1]_name:ModelB,hardware[1]_type:N,hardware[0]_vendor:cnfd}""" # 拆分输入的表头与数据行 lines = input_data.strip().split('\n') _, data_line = lines[0], lines[1] main_id, hardware_raw = data_line.split(',', 1) # 用正则提取硬件索引、属性名和属性值 hardware_map = {} pattern = re.compile(r'hardware\[(\d+)\]_([a-z]+):([^,}]+)') for match in pattern.finditer(hardware_raw): idx, prop, val = match.groups() idx = int(idx) if idx not in hardware_map: hardware_map[idx] = {} hardware_map[idx][f'hardware_{prop}'] = val.strip() # 生成目标格式输出 output_header = "Id,hardware_id,hardware_name,hardware_type,hardware_vendor" output_rows = [output_header] for hw_attrs in hardware_map.values(): # 按表头顺序提取属性,缺失则留空,最后剔除末尾空值 row = [ main_id, hw_attrs.get('hardware_id', ''), hw_attrs.get('hardware_name', ''), hw_attrs.get('hardware_type', ''), hw_attrs.get('hardware_vendor', '') ] while row and row[-1] == '': row.pop() output_rows.append(','.join(row)) # 打印结果 print('\n'.join(output_rows))
关于Python内置JSON处理函数的说明
Python内置的json模块仅支持标准JSON格式的解析与生成(要求键、字符串值必须用双引号包裹,结构符合JSON规范)。你的原始hardware_json是非标准格式(键无引号、用下划线分割索引与属性),无法直接用json.loads()解析,必须先通过字符串替换、正则提取等方式将其转换为可结构化的数据,之后可结合json模块处理中间数据。
如果能将原始数据修正为标准JSON(例如{"hardware": [{"id":123, "name":"ModelA"}, {"id":345, "name":"ModelB"}]}),则可直接用json.loads()快速解析为Python列表/字典,处理效率会更高。
内容的提问来源于stack exchange,提问作者RG6677
相关产品推荐
相关产品推荐

