讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Python中简化嵌套JSON结构以优化CSV转换

老瑶小哥_2412

老瑶小哥_2412

发布时间:2025-12-03 12:04:03

|

329人浏览过

|

来源于php中文网

原创

Python中简化嵌套JSON结构以优化CSV转换

本教程详细讲解如何利用python简化嵌套json结构,以优化其向csv格式的转换。核心策略是识别json中包含字典列表的字段,提取所需信息(如“name”),并将其合并为易于csv处理的单一字符串。此方法有效解决了复杂json字段的扁平化问题,确保输出的csv数据整洁、易读。

理解复杂JSON结构及其CSV转换挑战

在数据处理中,将JSON文件转换为CSV格式是一种常见需求。Python的Pandas库提供了便捷的pd.read_json方法,可以直接将JSON数据加载到DataFrame并导出为CSV。然而,当JSON数据包含复杂的嵌套结构,特别是列表内部包含多个字典对象时,直接转换往往会导致CSV文件格式不佳,难以直接分析。

考虑以下JSON结构示例:

{
    "field A": 117,
    "field B": 143,
    "field C": 27,
    "field D": [
        {"id": 782, "name": "Some test A", "type": "Group"}
    ],
    "field E": null,
    "field F": "contact",
    "field G": [
        {"id": 32358, "name": "Some test B", "type": "Note"},
        {"id": 37557, "name": "Some test C", "type": "Note"},
        {"id": 38416, "name": "Some test D", "type": "Note"}
    ],
    "field H": null
}

在此示例中,"field D"和"field G"是包含字典的列表。如果直接使用Pandas转换,这些字段可能会在CSV中显示为字符串化的列表,或者Pandas会尝试展开它们,导致多行或多列,这通常不是我们期望的。我们的目标是将这些复杂字段简化,例如,只保留每个字典中的"name"值,并将多个"name"值用换行符连接起来,使其在CSV中显示为单一的、易读的字符串,如下所示:

{
    "field A": 117,
    "field B": 143,
    "field C": 27,
    "field D": "Some test A",
    "field E": null,
    "field F": "contact",
    "field G": "Some test B \n Some test C \n Some test D",
    "field H": null
}

这种预处理步骤对于生成干净、可直接用于分析的CSV文件至关重要。

立即学习“Python免费学习笔记(深入)”;

核心数据预处理策略

要实现上述简化,我们需要在将JSON数据传递给Pandas之前,对其进行迭代处理和转换。核心思路是遍历JSON数据的键值对,识别出值为列表的字段,然后从这些列表中提取所需的特定信息(例如,字典中的"name"键),并将其合并成一个单一的字符串。

以下是实现这一策略的Python代码示例:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
import json

# 示例JSON数据
json_data = {
    "field A": 117,
    "field B": 143,
    "field C": 27,
    "field D": [
        {"id": 782, "name": "Some test A", "type": "Group"}
    ],
    "field E": None,
    "field F": "contact",
    "field G": [
        {"id": 32358, "name": "Some test B", "type": "Note"},
        {"id": 37557, "name": "Some test C", "type": "Note"},
        {"id": 38416, "name": "Some test D", "type": "Note"}
    ],
    "field H": None,
}

# 用于存储需要更新的键值对
items_to_update = []

# 遍历JSON数据的键值对
for key, values in json_data.items():
    # 检查当前值是否为列表
    if isinstance(values, list):
        # 使用列表推导式提取列表中每个字典的'name'值
        # 注意:这里使用.get('name')以防止'name'键不存在时报错
        names = [value.get('name') for value in values if isinstance(value, dict)]
        # 将提取出的名称用换行符和空格连接成一个字符串
        new_value = ' \n '.join(filter(None, names)) # 使用filter(None, names)移除可能存在的None值
        # 将新的键值对添加到待更新列表中
        items_to_update.append((key, new_value))

# 使用待更新列表更新原始JSON数据
json_data.update(items_to_update)

# 打印处理后的JSON数据
print(json.dumps(json_data, indent=4, ensure_ascii=False))

代码解析:

  1. json_data.items(): 遍历字典中的所有键值对。
  2. isinstance(values, list): 这一步是关键,它判断当前字段的值是否是一个列表。我们只对列表类型的字段进行处理。
  3. [value.get('name') for value in values if isinstance(value, dict)]: 这是一个列表推导式,用于从列表中提取数据。
    • if isinstance(value, dict): 确保列表中的每个元素都是字典,避免对非字典类型的数据进行get('name')操作。
    • value.get('name'): 安全地获取字典中的'name'键的值。如果'name'键不存在,get()方法会返回None,而不是抛出KeyError。
  4. ' \n '.join(filter(None, names)):
    • filter(None, names): 过滤掉names列表中可能存在的None值,避免它们被加入到最终的字符串中。
    • ' \n '.join(...): 将提取出的所有name值用' \n '(一个空格、一个换行符、一个空格)连接起来,形成一个单一的字符串。
  5. items_to_update.append((key, new_value)): 将处理后的键及其新值存储起来。
  6. json_data.update(items_to_update): 在遍历结束后,使用update方法一次性更新原始json_data字典,避免在迭代过程中修改字典引发错误。

经过上述处理,json_data将变为我们期望的简化结构:

{
    "field A": 117,
    "field B": 143,
    "field C": 27,
    "field D": "Some test A",
    "field E": null,
    "field F": "contact",
    "field G": "Some test B \n Some test C \n Some test D",
    "field H": null
}

整合Pandas进行最终CSV转换

当JSON数据被成功简化后,将其转换为CSV就变得非常直接和高效。我们可以将处理后的字典转换为Pandas DataFrame,然后利用to_csv方法导出。

以下是完整的代码示例,包括JSON读取、数据预处理和CSV导出:

import pandas as pd
import json

# 假设原始JSON文件名为 'test.json'
# 如果是直接从内存中的字典开始,则跳过文件读取部分
# with open('test.json', 'r', encoding='utf-8') as f:
#     original_json_data = json.load(f)

# 示例数据,如果从文件读取,则替换为 original_json_data
json_data = {
    "field A": 117,
    "field B": 143,
    "field C": 27,
    "field D": [
        {"id": 782, "name": "Some test A", "type": "Group"}
    ],
    "field E": None,
    "field F": "contact",
    "field G": [
        {"id": 32358, "name": "Some test B", "type": "Note"},
        {"id": 37557, "name": "Some test C", "type": "Note"},
        {"id": 38416, "name": "Some test D", "type": "Note"}
    ],
    "field H": None,
}

# --- 数据预处理逻辑 ---
items_to_update = []
for key, values in json_data.items():
    if isinstance(values, list):
        names = [value.get('name') for value in values if isinstance(value, dict)]
        new_value = ' \n '.join(filter(None, names))
        items_to_update.append((key, new_value))
json_data.update(items_to_update)
# --- 数据预处理结束 ---

# 将处理后的字典转换为Pandas DataFrame
# 注意:如果json_data是单个字典,需要将其放入列表中,或者使用pd.DataFrame.from_dict(json_data, orient='index').T
df = pd.DataFrame([json_data])

# 将DataFrame导出为CSV文件
# index=False 避免将DataFrame的索引写入CSV
df.to_csv('cleaned_output.csv', encoding='utf-8', index=False)

print("JSON数据已简化并成功转换为 'cleaned_output.csv'。")

在这个完整的流程中,我们首先定义或加载原始JSON数据,然后应用之前讨论的预处理逻辑来扁平化嵌套字段。最后,使用pd.DataFrame([json_data])将单个字典转换为一行DataFrame(如果JSON是包含多个对象的列表,则直接pd.DataFrame(json_data)),并通过to_csv方法将其保存为CSV文件。

注意事项与扩展

  1. 处理缺失键: 在提取'name'时,我们使用了value.get('name')而非value['name']。这是最佳实践,因为它能够优雅地处理某些字典可能不包含'name'键的情况,避免程序崩溃。如果需要对缺失'name'的情况进行特殊处理(例如,使用默认值或跳过该项),可以在列表推导式中加入更多逻辑。
  2. 自定义分隔符: 示例中使用了' \n '作为多个名称之间的分隔符。你可以根据实际需求更改此分隔符,例如', '(逗号加空格)或'|'(竖线)等,以便在CSV中更好地展示。
  3. 更深层次的嵌套: 如果JSON数据存在更深层次的嵌套(例如,列表中的字典中又包含列表),则需要采用递归函数来遍历并处理所有层级的复杂结构。
  4. 性能考量: 对于非常大的JSON文件,如果一次性加载到内存中进行处理会导致内存不足,可以考虑分块读取和处理,或者使用专门的流式JSON解析库(如ijson)。然而,对于大多数常见大小的文件,上述方法是高效且足够的。
  5. 数据类型变化: 经过处理后,原本的列表字段会变成字符串类型。这意味着在CSV中,这些字段将作为文本处理。如果后续需要对这些数据进行结构化分析,可能需要再次解析这些字符串。

通过遵循本教程的步骤,你将能够有效地管理和转换复杂的JSON数据,生成结构清晰、易于使用的CSV文件,从而大大提高数据处理的效率和质量。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2295

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3762

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1256

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4359

2025.09.10

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

360

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

891

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3451

2023.10.31

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn