新闻中心
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的列标题。
解决方案:利用Pandas库高效处理
Python的Pandas库是处理表格数据(如CSV、Excel、数据库表)的强大工具。它引入了DataFrame对象,能够非常直观和高效地处理列表字典这类结构化数据。Pandas能够自动识别字典的键作为列名,并将列表中的每个字典转换为DataFrame的一行。
1. 数据准备
首先,确保你的JSON数据已经通过json.loads()解析成了Python对象。假设我们有一个包含列表字典的Python字典,其结构与上述示例类似:
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的一行。
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
# 使用列表字典创建DataFrame
df = pd.DataFrame(list_of_dicts_to_csv)
print("
生成的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"
数据已成功导出到 {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("
CSV文件内容预览:")
# 读取并打印前几行以验证
with open(output_csv_filename, 'r') as f:
for i, line in enumerate(f):
print(line.strip())
if i >= 4: # 打印标题行和前4行数据
break注意事项与总结
- 数据结构理解: 明确JSON中"data"键的值是一个列表,且列表的每个元素都是一个字典。这是使用pd.DataFrame()的关键前提。如果JSON结构更复杂(例如字典中嵌套字典,且需要扁平化),可能需要额外的Pandas函数(如json_normalize)或自定义逻辑进行预处理。
- index=False: 在to_csv()方法中,index=False是一个非常重要的参数,它会阻止Pandas将DataFrame的默认数字索引作为CSV的第一列写入。在大多数情况下,CSV文件不需要这个索引。
- 错误处理: 在实际应用中,建议添加健壮的错误处理机制,例如检查"data"键是否存在,以及其值是否确实是列表,以防止因数据结构不一致导致的程序崩溃。
- 性能: 对于非常大的数据集,Pandas的DataFrame和to_csv()方法经过高度优化,通常比手动使用Python内置csv模块的DictWriter等方法效率更高、代码更简洁。
- 灵活性: Pandas DataFrame提供了丰富的数据清洗、转换和分析功能。在导出CSV之前,你可以利用这些功能对数据进行排序、筛选、重命名列或执行其他操作。
通过本教程,你现在应该能够熟练地使用Python和Pandas库,将JSON格式中包含列表字典的数据高效、准确地导出为CSV文件,从而简化你的数据处理工作流。
以上就是Python中将JSON格式的列表字典数据高效导出为CSV文件的详细内容,更多请关注其它相关文章!
# python
# js
# json
# 工具
# csv
# dns
# excel
# 是否存在
# 鞍山优化网站软件
# 线上推广营销应急预案
# 诸城市专业网站建设
# 上海seo干货
# 盘锦百度关键词排名
# 数字云跨境营销推广
# 邯郸网站建设与发展
# 网站建设推广经验总结
# 营销推广网站运营面试
# 外贸营销推广服务好
# 如何用
# 所示
# 并将
# 列表中
# 数据处理
# 都是
# 转换为
# 数据结构
# 是一个
# csv文件
# 数据清洗
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
火锅吃太多会怎样 火锅吃太多会上火吗
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
处理嵌套交互式控件:前端可访问性指南
Animex动漫社网入口地址 Animex动漫社网正版在线入口
Python中高效访问嵌套字典与列表中的键值对
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版
谷歌google账号注册详细步骤 谷歌账号注册官方教程
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
响应式图片在网页设计中的正确实现方法
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
快手网页版在线登录 快手网页版官网入口快速访问
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
qq游戏手机版下载安装_qq游戏移动端入口
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
PHP中高效并行检查多链接状态的教程
Win11怎么关闭快速启动_Win11彻底关机设置教程
大麦的“候补”是什么意思 大麦候补购票规则【详解】
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
高德地图怎么看全景照片_高德地图全景照片浏览教程
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
圆通快递查询实时追踪 圆通物流包裹状态快速查看
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
外媒分析《GTA6》定价:卖100美元可以但真没必要!
押井守高度称赞《辐射4》:玩了八年都停不下来!
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
163邮箱官方主页登录 直达网易邮箱登录核心页面
如何在 Excel Online 和 Google 表格中更改日期格式
PHP中获取MongoDB服务器运行时间(Uptime)的专业指南
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
SteamMachine定价或为699美元 大家想入手吗?
AO3最新可访问网址 Archive of Our Own官方在线入口
利用5118提升短视频内容效果_5118短视频关键词优化方法
Node.js中HTML按钮与J*aScript函数交互的正确姿势
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
b站怎么删除评论_b站评论管理与删除操作
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
网站内容防复制粘贴的实现策略与局限性
淘宝支付提示失败如何解决 淘宝支付流程优化方法
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
Mac怎么锁定备忘录_Mac备忘录加密设置教程


2025-11-30
浏览次数:次
返回列表
:")
for item in list_of_dicts_to_csv:
print(item)