0

0

Python中将JSON格式的列表字典数据高效导出为CSV文件

聖光之護

聖光之護

发布时间:2025-11-30 10:57:02

|

441人浏览过

|

来源于php中文网

原创

Python中将JSON格式的列表字典数据高效导出为CSV文件

本教程详细介绍了如何使用python高效地将包含列表字典的json数据结构转换为csv文件。针对json数据中常见的嵌套列表字典格式,文章推荐并演示了如何利用pandas库创建dataframe,并将其轻松导出为结构化csv,确保每个字典作为一行,其键作为列标题,从而简化数据处理流程。

引言:从单一字典到列表字典的CSV导出挑战

在数据处理中,将JSON格式的数据导出为CSV文件是一个常见需求。当JSON数据结构是一个扁平的字典时,直接提取其键作为CSV标题,值作为数据行相对简单。然而,当JSON数据变得更加复杂,特别是当它包含一个字典列表时,传统的逐键、逐值处理方法会变得繁琐且效率低下。例如,从API获取的数据常常以这种“列表字典”的形式呈现,其中每个字典代表一个独立的记录,而我们需要将这些记录逐一转换为CSV的行。

原始场景中,对于单个JSON字典:

{"id": 1702, "subnet": "10.111.0.0", "mask": "21", ...}

可以直接通过dict.keys()和dict.values()写入CSV的标题行和数据行。但当数据结构变为如下所示的“data”键下包含一个列表,且列表中每个元素都是一个字典时:

"data": [
    {"id": 1713, "subnet": "10.111.0.0", "mask": "27", ...},
    {"id": 1714, "subnet": "10.111.0.32", "mask": "27", ...},
    {"id": 1715, "subnet": "10.111.0.64", "mask": "27", ...}
]

此时,“data”键的值是一个列表,而这个列表的每个元素又是一个字典。我们的目标是将列表中的每个字典转换为CSV文件中的独立一行,并以字典的键作为CSV的列标题。

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

解决方案:利用Pandas库高效处理

Python的Pandas库是处理表格数据(如CSV、Excel、数据库表)的强大工具。它引入了DataFrame对象,能够非常直观和高效地处理列表字典这类结构化数据。Pandas能够自动识别字典的键作为列名,并将列表中的每个字典转换为DataFrame的一行。

1. 数据准备

首先,确保你的JSON数据已经通过json.loads()解析成了Python对象。假设我们有一个包含列表字典的Python字典,其结构与上述示例类似:

燕雀Logo
燕雀Logo

为用户提供LOGO免费设计在线生成服务

下载
import pandas as pd
import json

# 模拟从API获取的JSON响应内容
json_data_string = """
{
    "data": [
        {"id": 1713, "subnet": "10.111.0.0", "mask": "27", "description": "POD_Site", "masterSubnetId": 1702},
        {"id": 1714, "subnet": "10.111.0.32", "mask": "27", "description": "POD_Site", "masterSubnetId": 1702},
        {"id": 1715, "subnet": "10.111.0.64", "mask": "27", "description": "POD_Site", "masterSubnetId": 1702}
    ]
}
"""

# 解析JSON字符串为Python字典
raw_data = json.loads(json_data_string)

# 提取需要转换为CSV的列表字典部分
# 注意:这里 'data' 是一个键,其值是一个列表。
# 我们需要的是这个列表本身,而不是整个包含 'data' 键的字典。
list_of_dicts_to_csv = raw_data["data"]

print("待处理的列表字典数据:")
for item in list_of_dicts_to_csv:
    print(item)

2. 创建Pandas DataFrame

一旦获取到列表字典(list_of_dicts_to_csv),就可以使用pd.DataFrame()构造函数轻松地将其转换为DataFrame。Pandas会自动将每个字典的键识别为DataFrame的列,并将每个字典作为DataFrame的一行。

# 使用列表字典创建DataFrame
df = pd.DataFrame(list_of_dicts_to_csv)

print("\n生成的DataFrame:")
print(df)

输出的DataFrame将如下所示:

   id      subnet  mask description  masterSubnetId
0  1713  10.111.0.0    27    POD_Site            1702
1  1714  10.111.0.32   27    POD_Site            1702
2  1715  10.111.0.64   27    POD_Site            1702

3. 导出为CSV文件

DataFrame对象提供了to_csv()方法,可以将数据轻松导出为CSV文件。

# 导出DataFrame到CSV文件
# index=False 参数用于防止Pandas将DataFrame的行索引写入CSV文件,
# 这样可以保持CSV文件的整洁,只包含实际数据。
output_filename = 'ipamsubnet_nested.csv'
df.to_csv(output_filename, index=False)

print(f"\n数据已成功导出到 {output_filename}")

执行上述代码后,ipamsubnet_nested.csv文件内容将如下:

id,subnet,mask,description,masterSubnetId
1713,10.111.0.0,27,POD_Site,1702
1714,10.111.0.32,27,POD_Site,1702
1715,10.111.0.64,27,POD_Site,1702

这正是我们期望的结构,每个字典对应CSV的一行,键对应列标题。

完整示例代码

import pandas as pd
import json

# 模拟从API获取的JSON响应内容
# 这是一个包含 "data" 键的字典,其值是一个列表,列表中每个元素都是一个字典。
json_data_string = """
{
    "id": 1702, 
    "subnet": "10.111.0.0", 
    "mask": "21", 
    "sectionId": 3, 
    "description": "POD", 
    "linked_subnet": null, 
    "firewallAddressObject": null, 
    "vrfId": null, 
    "masterSubnetId": 1158, 
    "allowRequests": 0, 
    "vlanId": null, 
    "showName": 0, 
    "device": null, 
    "permissions": "{\\"4\\":\\"3\\"}", 
    "pingSubnet": 0, 
    "discoverSubnet": 0, 
    "resolveDNS": 0, 
    "DNSrecursive": 0, 
    "DNSrecords": 0, 
    "nameserverId": 0, 
    "scanAgent": 0, 
    "customer_id": null, 
    "isFolder": 0, 
    "isFull": 0, 
    "isPool": 0, 
    "tag": 2, 
    "threshold": 0, 
    "location": null, 
    "editDate": null, 
    "lastScan": null, 
    "lastDiscovery": null, 
    "calculation": {"Type": "IPv4", "IP address": "/", "Network": "10.111.0.0", "Broadcast": "10.111.7.255", "Subnet bitmask": "21", "Subnet netmask": "255.255.248.0", "Subnet wildcard": "0.0.7.255", "Min host IP": "10.111.0.1", "Max host IP": "10.111.7.254", "Number of hosts": "2046", "Subnet Class": "private A"},
    "data": [
        {"id": 1713, "subnet": "10.111.0.0", "mask": "27", "sectionId": 3, "description": "POD_Site", "linked_subnet": null, "firewallAddressObject": null, "vrfId": null, "masterSubnetId": 1702, "allowRequests": 0, "vlanId": null, "showName": 0, "device": null, "permissions": "{\\"4\\":\\"3\\"}", "pingSubnet": 0, "discoverSubnet": 0, "resolveDNS": 0, "DNSrecursive": 0, "DNSrecords": 0, "nameserverId": 0, "scanAgent": 0, "customer_id": null, "isFolder": 0, "isFull": 0, "isPool": 0, "tag": 2, "threshold": 0, "location": null, "editDate": null, "lastScan": null, "lastDiscovery": null}, 
        {"id": 1714, "subnet": "10.111.0.32", "mask": "27", "sectionId": 3, "description": "POD_Site", "linked_subnet": null, "firewallAddressObject": null, "vrfId": null, "masterSubnetId": 1702, "allowRequests": 0, "vlanId": null, "showName": 0, "device": null, "permissions": "{\\"4\\":\\"3\\"}", "pingSubnet": 0, "discoverSubnet": 0, "resolveDNS": 0, "DNSrecursive": 0, "DNSrecords": 0, "nameserverId": 0, "scanAgent": 0, "customer_id": null, "isFolder": 0, "isFull": 0, "isPool": 0, "tag": 2, "threshold": 0, "location": null, "editDate": null, "lastScan": null, "lastDiscovery": null}, 
        {"id": 1715, "subnet": "10.111.0.64", "mask": "27", "sectionId": 3, "description": "POD_Site", "linked_subnet": null, "firewallAddressObject": null, "vrfId": null, "masterSubnetId": 1702, "allowRequests": 0, "vlanId": null, "showName": 0, "device": null, "permissions": "{\\"4\\":\\"3\\"}", "pingSubnet": 0, "discoverSubnet": 0, "resolveDNS": 0, "DNSrecursive": 0, "DNSrecords": 0, "nameserverId": 0, "scanAgent": 0, "customer_id": null, "isFolder": 0, "isFull": 0, "isPool": 0, "tag": 2, "threshold": 0, "location": null, "editDate": null, "lastScan": null, "lastDiscovery": null}
    ]
}
"""

# 1. 解析JSON字符串
parsed_json = json.loads(json_data_string)

# 2. 提取需要写入CSV的数据部分
# 确认 'data' 键是否存在且其值是一个列表
if "data" in parsed_json and isinstance(parsed_json["data"], list):
    data_for_csv = parsed_json["data"]
else:
    print("错误:JSON结构中未找到 'data' 键或其值不是一个列表。")
    # 如果 'data' 不存在,或者不是列表,可以尝试处理其他结构,
    # 或者直接退出/抛出错误。
    exit()

# 3. 使用Pandas创建DataFrame
# pd.DataFrame() 能够直接将列表字典转换为 DataFrame,
# 字典的键将成为列名,每个字典成为一行。
df = pd.DataFrame(data_for_csv)

# 4. 导出DataFrame到CSV文件
# index=False 确保不将 DataFrame 的行索引写入 CSV 文件。
output_csv_filename = 'ipamsubnet_subnets.csv'
df.to_csv(output_csv_filename, index=False)

print(f"成功将数据导出到 '{output_csv_filename}'")
print("\nCSV文件内容预览:")
# 读取并打印前几行以验证
with open(output_csv_filename, 'r') as f:
    for i, line in enumerate(f):
        print(line.strip())
        if i >= 4: # 打印标题行和前4行数据
            break

注意事项与总结

  1. 数据结构理解: 明确JSON中"data"键的值是一个列表,且列表的每个元素都是一个字典。这是使用pd.DataFrame()的关键前提。如果JSON结构更复杂(例如字典中嵌套字典,且需要扁平化),可能需要额外的Pandas函数(如json_normalize)或自定义逻辑进行预处理。
  2. index=False: 在to_csv()方法中,index=False是一个非常重要的参数,它会阻止Pandas将DataFrame的默认数字索引作为CSV的第一列写入。在大多数情况下,CSV文件不需要这个索引。
  3. 错误处理: 在实际应用中,建议添加健壮的错误处理机制,例如检查"data"键是否存在,以及其值是否确实是列表,以防止因数据结构不一致导致的程序崩溃。
  4. 性能: 对于非常大的数据集,Pandas的DataFrame和to_csv()方法经过高度优化,通常比手动使用Python内置csv模块的DictWriter等方法效率更高、代码更简洁。
  5. 灵活性: Pandas DataFrame提供了丰富的数据清洗、转换和分析功能。在导出CSV之前,你可以利用这些功能对数据进行排序、筛选、重命名列或执行其他操作。

通过本教程,你现在应该能够熟练地使用Python和Pandas库,将JSON格式中包含列表字典的数据高效、准确地导出为CSV文件,从而简化你的数据处理工作流。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 12.7万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号