python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python JSON转CSV

Python实现将JSON转换为CSV格式

作者: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 环境已安装以下依赖:

使用 pip 安装 Free Spire.XLS:

pip install Spire.XLS.Free

此外,我们还将使用 Python 标准库中的 json 模块处理 JSON 数据(无需额外安装)。

2. 核心实现:将 JSON 数据转换为 CSV 文件

2.1 基础场景:简单 JSON 转 CSV

简单 JSON 指无嵌套、键值对结构统一的 JSON 数组(如[{"name":"张三","age":25}, ...]),是最基础的转换场景。

实现逻辑:

完整代码:

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")

关键代码解释:

转换结果:

2.2 进阶场景:嵌套 JSON 转 CSV

实际业务中 JSON 常包含嵌套结构(如 {"name":"张三","info":{"age":25,"city":"北京"}}),直接转换会丢失嵌套数据,需先将嵌套字典“扁平化”。

实现逻辑:

完整代码:

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")

关键代码解释:

转换结果:

3. 常见问题与解决方案

3.1 中文乱码问题

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文