如何自动扁平化包含嵌套列表与字典的超大型JSON并导出为CSV?
JSON层级结构自动化扁平化方案
针对你不需要手动指定嵌套路径、离线处理少量数据的需求,直接用递归实现全自动化扁平化即可,无需手动配置json_normalize的record_path和meta参数,实现代码如下:
import pandas as pd def flatten_json(nested_json, parent_key='', sep='.'): items = [] if isinstance(nested_json, dict): for k, v in nested_json.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k # 处理bytes类型转字符串 if isinstance(v, bytes): v = v.decode('utf-8') # 递归处理字典 if isinstance(v, dict): items.extend(flatten_json(v, new_key, sep=sep).items()) # 处理列表 elif isinstance(v, list): # 判断列表内是否全为基础数据类型 all_basic = all(not isinstance(i, (dict, list)) for i in v) if all_basic: # 基础类型列表转逗号分隔字符串 items.append((new_key, ','.join(map(str, v)))) else: # 嵌套结构的列表,逐个展开处理 for idx, item in enumerate(v): items.extend(flatten_json(item, f"{new_key}[{idx}]", sep=sep).items()) else: items.append((new_key, v)) elif isinstance(nested_json, list): # 兼容根节点为列表的场景 for idx, item in enumerate(nested_json): items.extend(flatten_json(item, f"[{idx}]", sep=sep).items()) return dict(items) # 测试你的示例数据 d2 = {'key2':None, 'a':1 , 'b':{'v':[1,2,3]}, 'c': {'c1':'c1', 'c2':'c2'}, 'd': {'d1': 1, 'd2':{'d3': 'd3', 'd4': 'd4', 'd5':[3,3,3,4]}}, 'key': {'seqOf': [{'seqOf': {'dedicatedAccountID': '191', 'campaignIdentifier': None, 'transactionAmount': b'106.670000', 'adjustmentAmount': None, 'accountBalance': b'122.000000', 'accountExpiryDateBefore': None, 'accountExpiryDateAfter': None, 'accountStartDateBefore': None, 'accountStartDateAfter': None, 'mainDedicatedAccountID': None, 'offerIdentifier': None, 'dedicatedAccountUnit': '1', 'transactionUnits': None, 'adjustmentUnits': None, 'unitBalance': None, 'realMoneyFlag': None} }]}} # 扁平化后转DataFrame导出CSV flat_data = flatten_json(d2) pd.DataFrame([flat_data]).to_csv("output.csv", index=False, encoding="utf-8-sig")
效果说明
运行上述代码后,所有嵌套层级的键都会自动以.拼接作为CSV列名,示例中d.d2.d5会转为3,3,3,4的字符串存储,key.seqOf[0].seqOf.dedicatedAccountID会直接作为列名,对应值为191,完全不需要手动指定任何路径参数。如果需要将列表内的字典展开为多行,仅需对上述代码做简单调整即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者Thadeu Melo
相关产品推荐
相关产品推荐

