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

不使用pandas、csvwriter等工具,手动实现嵌套JSON转CSV的技术求助

问题:原生Python实现嵌套JSON转指定CSV(禁用第三方/内置CSV工具)

输入JSON格式:

[
    {
        "x":"data",
        "y":"data2",
        "z": {
            "abc": [1,2,3,4],
            "efg": "data3"
        }
    },
    {
        "x":"data4",
        "y":"data5",
        "n": "data6",
        "z": {
            "abc": [1,2,3,4],
            "efg": "data6"
        }
    }
]

需求说明

  • 硬编码CSV表头为x,y,n,abc,efg
  • 缺失字段直接留空
  • 禁止使用pandas、csv.writer、csv.DictWriter等工具,必须用原生Python实现
  • 目标CSV格式示例:
x,y,n,abc,efg
data,data2,,[1,2,3,4],data3
data4,data5,data6,[1,2,3,4],data6

现有代码

import json

def func(inputFile, outputFile):
    with open(inputFile, 'r') as file:
        jsonFile = json.load(file)
    with open(outputFile, 'w') as csvFile:
        csvFile.write('x,y,z,abc,efg\n')

    return csvFile

原生实现方案

直接修改现有代码,通过字段提取、字符串拼接完成转换,关键逻辑如下:

  1. 修正表头为要求的x,y,n,abc,efg
  2. 用dict.get()安全提取字段,避免缺失字段报错
  3. 处理嵌套的z字典,逐层提取内部的abc和efg
  4. 将数组格式的abc转为字符串,保留原格式
  5. 拼接每行内容并写入文件

完整代码

import json

def func(inputFile, outputFile):
    # 硬编码指定表头
    headers = ['x', 'y', 'n', 'abc', 'efg']
    with open(inputFile, 'r') as file:
        json_data = json.load(file)
    
    with open(outputFile, 'w') as csvFile:
        # 写入表头行
        csvFile.write(','.join(headers) + '\n')
        
        # 遍历每个JSON对象生成CSV行
        for item in json_data:
            # 提取顶层字段,缺失则为空字符串
            x_val = item.get('x', '')
            y_val = item.get('y', '')
            n_val = item.get('n', '')
            
            # 处理嵌套的z字段,不存在则用空字典兜底
            z_dict = item.get('z', {})
            abc_val = z_dict.get('abc', '')
            # 将数组转为字符串格式,保持[1,2,3,4]的样式
            if isinstance(abc_val, list):
                abc_val = str(abc_val)
            efg_val = z_dict.get('efg', '')
            
            # 拼接当前行的所有值,空值直接留空
            row = [x_val, y_val, n_val, abc_val, efg_val]
            row_str = ','.join(str(val) if val != '' else '' for val in row)
            
            # 写入当前行
            csvFile.write(row_str + '\n')
    
    # with块结束后文件已关闭,无需返回文件对象
    return None

关键细节

  • 用dict.get(key, default)替代直接索引,避免缺失字段抛出KeyError
  • 嵌套字段z先判断是否存在,不存在则用空字典,确保后续提取abc/efg不会报错
  • 数组类型的abc直接转字符串,完美匹配需求中的格式
  • 所有字段统一转为字符串后再拼接,避免类型错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:42