Python实现将JSON转换为CSV格式

 更新时间:2026年03月04日 08:24:34   作者:Eiceblue  
JSON(JavaScript  Object Notation)和 CSV(Comma-Separated Values)是数据交换和存储中最常用的两种格式,本文将详细介绍如何使用Free Spire.XLS for 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操作PDF文件之实现A3页面转A4

    Python操作PDF文件之实现A3页面转A4

    这篇文章主要为大家详细介绍了Python操作PDF文件之实现A3页面转A4功能的相关资料,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • 用python监控服务器的cpu,磁盘空间,内存,超过邮件报警

    用python监控服务器的cpu,磁盘空间,内存,超过邮件报警

    这篇文章主要介绍了如果用python监控服务器的cpu,磁盘空间,内存,超过邮件报警,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • python实现朴素贝叶斯算法

    python实现朴素贝叶斯算法

    这篇文章主要为大家详细介绍了Python实现朴素贝叶斯算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 修改Pandas的行或列的名字(重命名)

    修改Pandas的行或列的名字(重命名)

    这篇文章主要介绍了修改Pandas的行或列的名字(重命名),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python编程中运用闭包时所需要注意的一些地方

    Python编程中运用闭包时所需要注意的一些地方

    这篇文章主要介绍了Python编程中运用闭包时所需要注意的一些地方,文章来自国内知名的Python开发者felinx的博客,需要的朋友可以参考下
    2015-05-05
  • PyTorch如何创建自己的数据集

    PyTorch如何创建自己的数据集

    这篇文章主要介绍了PyTorch如何创建自己的数据集,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • TensorFlow实现Batch Normalization

    TensorFlow实现Batch Normalization

    这篇文章主要为大家详细介绍了TensorFlow实现Batch Normalization,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python+request+unittest实现接口测试框架集成实例

    Python+request+unittest实现接口测试框架集成实例

    这篇文章主要介绍了Python+request+unittest实现接口测试框架集成实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 10行Python代码计算汽车数量的实现方法

    10行Python代码计算汽车数量的实现方法

    这篇文章主要介绍了10行Python代码计算汽车数量的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • numpy matrix和array的乘和加实例

    numpy matrix和array的乘和加实例

    今天小编就为大家分享一篇numpy matrix和array的乘和加实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论