Python实现将JSON转换为CSV格式
JSON(JavaScript Object Notation)和 CSV(Comma-Separated Values)是数据交换和存储中最常用的两种格式。JSON 以其灵活的结构化表示方式广泛应用于 API 接口、配置文件等场景,而 CSV 则因其简洁的表格形式在数据分析、电子表格处理和数据库导入导出中占据主导地位。在实际工作中,我们经常需要将 JSON 数据转换为 CSV 格式,以便利用 Excel、Pandas 等工具进行进一步分析或可视化。
本文将详细介绍如何使用免费库 Free Spire.XLS for Python 将 JSON 数据转换为 CSV 文件,涵盖环境配置、基本转换、嵌套数据处理以及常见问题的解决方案。
1. 环境准备
在开始之前,请确保您的 Python 环境已安装以下依赖:
- Python 3.6 或更高版本
- Free Spire.XLS for Python 库
使用 pip 安装 Free Spire.XLS:
pip install Spire.XLS.Free
此外,我们还将使用 Python 标准库中的 json 模块处理 JSON 数据(无需额外安装)。
2. 核心实现:将 JSON 数据转换为 CSV 文件
2.1 基础场景:简单 JSON 转 CSV
简单 JSON 指无嵌套、键值对结构统一的 JSON 数组(如[{"name":"张三","age":25}, ...]),是最基础的转换场景。
实现逻辑:
- 读取并解析 JSON 文件为 Python 列表;
- 提取所有唯一键作为 CSV 表头;
- 初始化
Workbook/Worksheet对象,写入表头和数据; - 保存为 CSV 格式并释放资源。
完整代码:
import json
from spire.xls import *
from spire.xls.common import *
def simple_json_to_csv(json_path: str, csv_path: str) -> None:
"""
简单结构JSON转CSV(无嵌套)
:param json_path: 输入JSON文件路径
:param csv_path: 输出CSV文件路径
"""
try:
# 1. 读取并解析JSON数据
with open(json_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
# 校验数据格式(必须是包含字典的列表)
if not isinstance(json_data, list) or not all(isinstance(item, dict) for item in json_data):
raise ValueError("JSON数据需为「包含字典的列表」格式")
# 2. 提取表头(去重)
headers = []
for item in json_data:
for key in item.keys():
if key not in headers:
headers.append(key)
# 3. 初始化Excel工作簿和工作表
workbook = Workbook()
worksheet = workbook.Worksheets[0]
# 4. 写入表头(第一行)
for col_idx, header in enumerate(headers, start=1):
worksheet.Range[1, col_idx].Text = header
# 5. 写入数据行(从第二行开始)
for row_idx, item in enumerate(json_data, start=2):
for col_idx, header in enumerate(headers, start=1):
# 处理空值,避免KeyError
cell_value = item.get(header, "")
worksheet.Range[row_idx, col_idx].Text = str(cell_value)
# 6. 保存为CSV并释放资源
worksheet.SaveToFile(csv_path, ",", Encoding.get_UTF8())
workbook.Dispose()
print(f"转换完成!CSV文件路径:{csv_path}")
except Exception as e:
print(f"转换失败:{str(e)}")
# 测试调用
if __name__ == "__main__":
# 示例test.json内容:
# [{"name":"张三","age":25,"city":"北京"},{"name":"李四","age":30,"city":"上海"}]
simple_json_to_csv("test.json", "simple_result.csv")
关键代码解释:
json.load():将 JSON 文件解析为 Python 原生数据结构(列表/字典);worksheet.Range[row, col]:Free Spire.XLS 的单元格定位方式,行/列从1开始计数;Dispose():释放 Workbook 占用的内存资源,避免内存泄漏。
转换结果:

2.2 进阶场景:嵌套 JSON 转 CSV
实际业务中 JSON 常包含嵌套结构(如 {"name":"张三","info":{"age":25,"city":"北京"}}),直接转换会丢失嵌套数据,需先将嵌套字典“扁平化”。
实现逻辑:
- 编写递归函数扁平化嵌套字典;
- 解析 JSON 并应用扁平化处理;
- 后续步骤同基础场景。
完整代码:
import json
from spire.xls import *
from spire.xls.common import *
def flatten_dict(nested_dict: dict, parent_key: str = '', sep: str = '_') -> dict:
"""
递归扁平化嵌套字典
:param nested_dict: 待扁平化的嵌套字典
:param parent_key: 父键名(递归使用)
:param sep: 键名分隔符(如info_age)
:return: 扁平化后的单层字典
"""
items = []
for k, v in nested_dict.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
# 递归处理嵌套层级
items.extend(flatten_dict(v, new_key, sep).items())
else:
items.append((new_key, v))
return dict(items)
def nested_json_to_csv(json_path: str, csv_path: str) -> None:
"""
嵌套结构JSON转CSV
:param json_path: 输入JSON文件路径
:param csv_path: 输出CSV文件路径
"""
try:
# 1. 读取并解析JSON
with open(json_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
# 2. 扁平化所有嵌套字典
flattened_data = []
for item in json_data:
flattened_item = flatten_dict(item)
flattened_data.append(flattened_item)
# 3. 提取表头(扁平化后的键)
headers = []
for item in flattened_data:
for key in item.keys():
if key not in headers:
headers.append(key)
# 4. 初始化工作簿并写入数据(同基础场景)
workbook = Workbook()
worksheet = workbook.Worksheets[0]
# 写入表头
for col_idx, header in enumerate(headers, start=1):
worksheet.Range[1, col_idx].Text = header
# 写入扁平化数据
for row_idx, item in enumerate(flattened_data, start=2):
for col_idx, header in enumerate(headers, start=1):
cell_value = item.get(header, "")
worksheet.Range[row_idx, col_idx].Text = str(cell_value)
# 保存并释放资源
worksheet.SaveToFile(csv_path, ",", Encoding.get_UTF8())
workbook.Dispose()
print(f"嵌套JSON转换完成!CSV文件路径:{csv_path}")
except Exception as e:
print(f"转换失败:{str(e)}")
# 测试调用
if __name__ == "__main__":
# 示例nested_test.json内容:
# [{"name":"张三","info":{"age":25,"job":{"title":"工程师"}}},{"name":"李四","info":{"age":30,"job":{"title":"产品经理"}}}]
nested_json_to_csv("nested_test.json", "nested_result.csv")
关键代码解释:
flatten_dict:核心递归函数,将嵌套键拼接为单层(如info_job_title),解决嵌套数据丢失问题;- 扁平化后的数据处理逻辑与基础场景一致,保证 CSV 结构规整。
转换结果:

3. 常见问题与解决方案
3.1 中文乱码问题
- 现象:CSV 文件用 Excel 打开后中文显示乱码;
- 解决方案:转换时指定了 UTF-8 编码,若 Excel 兼容问题,可将 CSV 用记事本打开,“另存为” 选择 “UTF-8-BOM” 编码。
3.2 特殊字符导致格式错乱
现象:换行符、制表符导致 CSV 单元格错位;
解决方案:写入前转义特殊字符:
cell_value = str(cell_value).replace('\n', ' ').replace('\r', ' ').replace('\t', ' ')
4. 总结
通过结合 Python 的 json 模块进行数据解析,并利用 Free Spire.XLS 强大的工作表操作能力,我们可以灵活地处理嵌套结构、自定义扁平化策略,并最终生成符合预期的 CSV 文件。该方法特别适合需要与 Excel 工作流紧密结合的场景,或者当需要在同一个项目中同时处理 Excel 和 CSV 格式时。
到此这篇关于Python实现将JSON转换为CSV格式的文章就介绍到这了,更多相关Python JSON转CSV内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
这篇文章主要介绍了如果用python监控服务器的cpu,磁盘空间,内存,超过邮件报警,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下2021-01-01
TensorFlow实现Batch Normalization
这篇文章主要为大家详细介绍了TensorFlow实现Batch Normalization,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03
Python+request+unittest实现接口测试框架集成实例
这篇文章主要介绍了Python+request+unittest实现接口测试框架集成实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03


最新评论