如何用Python将嵌套JSON转为含0/1值的CSV?适配扩展避免硬编码
解决JSON转0/1值CSV的动态适配方案
嘿,我来帮你搞定这个JSON转CSV的需求!你的核心诉求是把每个slot的物品列表转成对应物品的0/1标记,还要能适配物品和slot的扩展、避免硬编码对吧?我给你一套既简洁又符合最佳实践的方案,完全不用纠结多层循环的问题。
思路拆解
- 动态提取所有物品:从JSON的所有slot里自动收集唯一物品作为CSV表头,不用手动列出来
- 用DictWriter简化写入:Python的
csv.DictWriter可以自动根据表头匹配列,完美适配新增的物品或slot - 0/1值快速生成:利用集合的
in操作判断物品是否存在,一行代码搞定值的赋值
完整代码实现
import json import csv # 读取JSON inventory文件 with open('equip_inventory.json', 'r') as json_file: inventory_dict = json.load(json_file) # 收集所有唯一物品,去重后排序(排序可选,保证表头顺序稳定) all_unique_items = sorted({item for items_list in inventory_dict.values() for item in items_list}) # 定义CSV表头:第一列是inventory,后面跟着所有物品 csv_columns = ['inventory'] + all_unique_items # 写入CSV文件 with open('equip_inventory.csv', 'w', newline='') as csv_file: # 初始化DictWriter,指定表头 writer = csv.DictWriter(csv_file, fieldnames=csv_columns) writer.writeheader() # 先写入表头 # 遍历每个slot,生成对应的行数据 for slot_name, slot_items in inventory_dict.items(): row_data = {'inventory': slot_name} # 给每个物品列赋值1或0 for item in all_unique_items: row_data[item] = 1 if item in slot_items else 0 writer.writerow(row_data)
方案优势
- 完全动态适配:不管新增多少物品(比如e、f、g)或者slot(slot5、slot6),代码都能自动识别并处理,完全不需要硬编码行列
- 简洁高效:用集合推导式收集物品,比多层循环手动去重更简洁;
DictWriter自动处理列匹配,避免手动拼接列表的出错风险 - 可维护性强:逻辑清晰,每个步骤的职责明确,后续修改需求也很容易调整
测试结果
用你提供的equip_inventory.json测试,生成的CSV完全符合预期:
inventory,a,b,c,d slot1,1,1,0,0 slot2,0,0,1,1 slot3,1,1,1,0 slot4,0,0,0,1
内容的提问来源于stack exchange,提问作者n01
相关产品推荐
相关产品推荐

