You need to enable JavaScript to run this app. Python嵌套字典列表导出指定扁平化CSV时的输出异常解决方案
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套字典列表导出指定扁平化CSV时的输出异常解决方案

嵌套结构扁平化导出CSV实现方案

原代码核心问题定位

  • 遍历逻辑错位:原始data是字典构成的列表,并非单层字典,原代码sorted(data)直接对列表做排序遍历,完全没有进入产品内部的嵌套结构提取字段
  • 字段拆解缺失:没有按照目标CSV的列映射关系拆分嵌套内容,直接把option、variant等嵌套对象整体转为字符串写入
  • 分支逻辑颠倒:原代码if len(value) > 0: writerow([key, value]) 逻辑完全反向,只要值非空就直接整体写入,根本不会进入嵌套循环展开内容
  • 通用嵌套转CSV的参考方案未适配当前业务的固定输出列要求,直接套用会生成和目标结构不匹配的结果

可直接运行的实现代码

import csv

# 匹配API返回的原始数据结构
data = [
    {
        'id': 'productID1', 'name': 'productname A',
        'option': {
            'size': {
                'type': 'list',
                'name': 'size',
                'choices': [{'value': 'M'}]
            }
        },
        'variant': [{
            'id': 'variantID1',
            'choices': {'size': 'M'},
            'attributes': {'currency': 'USD', 'price': 1}
        }]
    },
    # 补充对应目标CSV行的测试数据
    {
        'id': 'productID1', 'name': 'productname A',
        'option': {},
        'variant': [{
            'id': 'variantID2',
            'choices': {'size': 'L'},
            'attributes': {'currency': 'USD', 'price': 2}
        }]
    },
    {
        'id': 'productID2', 'name': 'productname A',
        'option': {},
        'variant': [{
            'id': 'variantID3',
            'choices': {'size': 'XL'},
            'attributes': {'currency': 'USD', 'price': 3}
        }]
    }
]

# 目标CSV固定列定义
csv_headers = ['id', 'productname', 'variantid', 'size', 'currency', 'price']

with open('productdata.csv', 'w', newline='', encoding='utf-8') as output:
    # 可根据业务需求调整分隔符,当前默认匹配目标CSV的逗号分隔格式
    writer = csv.writer(output, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
    # 写入表头
    writer.writerow(csv_headers)
    # 逐产品遍历
    for product in data:
        # 提取产品级公共字段
        product_id = product['id']
        product_name = product['name']
        # 逐变体遍历,每个变体单独生成一行CSV
        for variant in product['variant']:
            variant_id = variant['id']
            size_val = variant['choices']['size']
            currency = variant['attributes']['currency']
            price = variant['attributes']['price']
            # 按列顺序拼接写入行
            writer.writerow([product_id, product_name, variant_id, size_val, currency, price])

生成效果

运行上述代码后得到的CSV内容完全匹配要求的目标格式:

"id","productname","variantid","size","currency","price"
"productID1","productname A","variantID1","M","USD",1
"productID1","productname A","variantID2","L","USD",2
"productID2","productname A","variantID3","XL","USD",3

灵活调整说明

  • 不需要改动API返回的原始列表结构,仅通过逐层级字段提取完成扁平化
  • 若后续需要增加导出列,仅需在csv_headers中新增列名,再在variant循环中提取对应嵌套字段值即可
  • 若业务要求使用分号作为分隔符,仅需将writer初始化参数中的delimiter改为';'即可,完全兼容原代码的配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 08:06:03