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
相关产品推荐
相关产品推荐

