如何将含嵌套action_history的JSON字典转换为指定格式CSV?
问题描述
需要从JSON数据中提取recordID、date、title字段,并将嵌套的action_history数组拆分为CSV的独立行——每行关联对应主记录的recordID、title、date字段,而非将action_history作为整列输出。
示例数据
输入JSON示例
[ { "recordID": "REC001", "date": "2024-05-20", "title": "项目启动", "action_history": [ { "actionID": "ACT001", "actionName": "创建任务", "operator": "张三" }, { "actionID": "ACT002", "actionName": "分配资源", "operator": "李四" } ] }, { "recordID": "REC002", "date": "2024-05-21", "title": "需求评审", "action_history": [ { "actionID": "ACT003", "actionName": "发起评审", "operator": "王五" } ] } ]
当前输出(不符合需求)
| recordID | date | title | action_history |
|---|---|---|---|
| REC001 | 2024-05-20 | 项目启动 | [{"actionID":"ACT001","actionName":"创建任务","operator":"张三"}, {"actionID":"ACT002","actionName":"分配资源","operator":"李四"}] |
| REC002 | 2024-05-21 | 需求评审 | [{"actionID":"ACT003","actionName":"发起评审","operator":"王五"}] |
期望输出
| recordID | date | title | actionID | actionName | operator |
|---|---|---|---|---|---|
| REC001 | 2024-05-20 | 项目启动 | ACT001 | 创建任务 | 张三 |
| REC001 | 2024-05-20 | 项目启动 | ACT002 | 分配资源 | 李四 |
| REC002 | 2024-05-21 | 需求评审 | ACT003 | 发起评审 | 王五 |
解决方案脚本
import json import csv # 读取JSON数据 with open('input.json', 'r', encoding='utf-8') as f: data = json.load(f) # 定义CSV完整表头 headers = ['recordID', 'date', 'title', 'actionID', 'actionName', 'operator'] # 写入目标CSV文件 with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=headers) writer.writeheader() # 遍历每条主记录 for record in data: # 提取主记录的固定字段 base_info = { 'recordID': record['recordID'], 'date': record['date'], 'title': record['title'] } # 遍历当前记录的每个动作历史,生成独立行 for action in record['action_history']: # 合并主记录字段与动作字段 output_row = {**base_info, **action} writer.writerow(output_row)
脚本说明
- 先加载JSON数据,定义包含主记录字段和动作字段的完整表头
- 遍历每条主记录,提取
recordID、date、title三个固定字段 - 对每个主记录下的
action_history条目,将主字段与动作字段合并为一行后写入CSV - 全程使用UTF-8编码,避免中文乱码问题
内容的提问来源于stack exchange,提问作者Shwfgd
相关产品推荐
相关产品推荐

