使用Python高效拆分JSON数组为多个独立文件

聖光之護
发布: 2025-10-10 14:50:25
原创
443人浏览过

使用Python高效拆分JSON数组为多个独立文件

本文详细介绍了如何利用Python的json模块将包含JSON对象数组的大型JSON文件或字符串数据拆分为多个独立的JSON文件。通过迭代数组中的每个对象,并将其分别写入到以索引命名的文件中,本教程提供了两种核心场景的解决方案:从现有文件读取数据和从Python字符串变量加载数据,旨在帮助用户高效管理和处理结构化的JSON数据。

在数据处理和管理中,我们经常会遇到包含大量独立记录的json文件,这些记录以数组的形式存储。为了便于后续的独立处理、存储或分发,将这些json数组中的每个对象拆分成单独的json文件是一个常见的需求。python的json模块提供了强大而简洁的工具来完成这项任务。

核心概念

要实现JSON文件的拆分,我们需要理解JSON数据在Python中的表示:

  • 一个JSON数组([...])在Python中对应一个列表(list)。
  • 一个JSON对象({...})在Python中对应一个字典(dict)。

因此,拆分过程本质上就是遍历一个包含字典的Python列表,并将每个字典序列化为独立的JSON文件。

场景一:从文件读取JSON数据并拆分

这是最常见的场景,即您有一个存储在磁盘上的JSON文件,其中包含一个JSON对象数组。

示例JSON文件 (data.json) 内容:

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

[
    {"any": 2023},
    {
        "dia": 24,
        "mes": 1,
        "any": 2023,
        "mes_referencia": 12,
        "any_referencia": 2022,
        "calendari_nom": "CCC"
    },
    {
        "dia": 4,
        "mes": 12,
        "any": 2023,
        "mes_referencia": 10,
        "any_referencia": 2023,
        "calendari_nom": "FFF"
    },
    {
        "dia": 4,
        "mes": 1,
        "any": 2023,
        "mes_referencia": 0,
        "any_referencia": 2022,
        "calendari_nom": "GAS",
        "periode_ref": "TT"
    },
    {
        "dia": 3,
        "mes": 10,
        "any": 2023,
        "mes_referencia": 0,
        "any_referencia": 2023,
        "calendari_nom": "GAS",
        "periode_ref": "22"
    }
]
登录后复制

Python 代码实现:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
import json
import os

def split_json_file(input_filepath, output_dir="output_json_files"):
    """
    将包含JSON对象数组的文件拆分为多个独立文件。

    Args:
        input_filepath (str): 输入JSON文件的路径。
        output_dir (str): 存储拆分后文件的目录。
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"创建输出目录: {output_dir}")

    try:
        with open(input_filepath, "r", encoding="utf-8") as f_in:
            data = json.load(f_in)

        if not isinstance(data, list):
            print("警告:输入JSON文件的根元素不是一个列表,无法按预期拆分。")
            return

        print(f"开始拆分文件 '{input_filepath}'...")
        for i, item in enumerate(data, 1): # 从1开始计数,以便生成文件名
            output_filename = os.path.join(output_dir, f"data_out_{i}.json")
            with open(output_filename, "w", encoding="utf-8") as f_out:
                json.dump(item, f_out, indent=4, ensure_ascii=False)
            print(f"已生成文件: {output_filename}")
        print("所有JSON对象已成功拆分为独立文件。")

    except FileNotFoundError:
        print(f"错误:文件 '{input_filepath}' 未找到。")
    except json.JSONDecodeError:
        print(f"错误:文件 '{input_filepath}' 不是一个有效的JSON格式。")
    except Exception as e:
        print(f"发生未知错误: {e}")

# 假设 data.json 存在于当前目录下
# 创建一个 dummy data.json 文件用于测试
dummy_json_content = """
[
    {"any": 2023},
    {
        "dia": 24,
        "mes": 1,
        "any": 2023,
        "mes_referencia": 12,
        "any_referencia": 2022,
        "calendari_nom": "CCC"
    },
    {
        "dia": 4,
        "mes": 12,
        "any": 2023,
        "mes_referencia": 10,
        "any_referencia": 2023,
        "calendari_nom": "FFF"
    }
]
"""
with open("data.json", "w", encoding="utf-8") as f:
    f.write(dummy_json_content)

# 调用函数进行拆分
split_json_file("data.json")

# 预期输出示例 (data_out_2.json):
# {
#     "dia": 24,
#     "mes": 1,
#     "any": 2023,
#     "mes_referencia": 12,
#     "any_referencia": 2022,
#     "calendari_nom": "CCC"
# }
登录后复制

代码解析:

  1. import json 和 import os: 导入处理JSON和文件路径的模块。
  2. split_json_file 函数: 封装拆分逻辑,提高可重用性。
  3. 创建输出目录: os.makedirs(output_dir) 确保目标目录存在。
  4. 读取输入文件: 使用 with open(input_filepath, "r", encoding="utf-8") as f_in: 以只读模式打开文件,并指定UTF-8编码
  5. 加载JSON数据: data = json.load(f_in) 将文件内容解析为Python对象(预期是一个列表)。
  6. 验证数据类型: 检查 data 是否为列表,以确保可以按预期迭代。
  7. 遍历并写入:
    • enumerate(data, 1) 用于迭代列表中的每个元素,并同时提供一个从1开始的索引 i。
    • output_filename = os.path.join(output_dir, f"data_out_{i}.json") 构建每个输出文件的完整路径和名称。
    • with open(output_filename, "w", encoding="utf-8") as f_out: 以写入模式打开新的文件。
    • json.dump(item, f_out, indent=4, ensure_ascii=False) 将当前的Python字典 item 序列化为JSON格式并写入到新文件中。indent=4 使输出的JSON格式化,更易读;ensure_ascii=False 确保非ASCII字符(如中文)能正常显示。
  8. 错误处理: 使用 try-except 块捕获 FileNotFoundError 和 json.JSONDecodeError,提升程序的健壮性。

场景二:从字符串变量读取JSON数据并拆分

有时,JSON数据可能不是来自文件,而是以字符串的形式存在于Python变量中(例如,从网络API获取的响应)。

示例JSON字符串 (json_output) 内容:

json_output = """\
[
{"any": 2023},
{
"dia": 24,
"mes": 1,
"any": 2023,
"mes_referencia": 12,
"any_referencia": 2022,
"calendari_nom": "CCC"
},
{
"dia": 4,
"mes": 12,
"any": 2023,
"mes_referencia": 10,
"any_referencia": 2023,
"calendari_nom": "FFF"
},
{
"dia": 4,
"mes": 1,
"any": 2023,
"mes_referencia": 0,
"any_referencia": 2022,
"calendari_nom": "GAS",
"periode_ref": "TT"
},
{
"dia": 3,
"mes": 10,
"any": 2023,
"mes_referencia": 0,
"any_referencia": 2023,
"calendari_nom": "GAS",
"periode_ref": "22"
}
]"""
登录后复制

Python 代码实现:

import json
import os

def split_json_string(json_string_data, output_dir="output_json_files_from_string"):
    """
    将包含JSON对象数组的字符串数据拆分为多个独立文件。

    Args:
        json_string_data (str): 包含JSON数据的字符串。
        output_dir (str): 存储拆分后文件的目录。
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"创建输出目录: {output_dir}")

    try:
        data = json.loads(json_string_data)

        if not isinstance(data, list):
            print("警告:输入JSON字符串的根元素不是一个列表,无法按预期拆分。")
            return

        print("开始拆分JSON字符串数据...")
        for i, item in enumerate(data, 1):
            output_filename = os.path.join(output_dir, f"data_out_{i}.json")
            with open(output_filename, "w", encoding="utf-8") as f_out:
                json.dump(item, f_out, indent=4, ensure_ascii=False)
            print(f"已生成文件: {output_filename}")
        print("所有JSON对象已成功拆分为独立文件。")

    except json.JSONDecodeError:
        print("错误:输入的字符串不是一个有效的JSON格式。")
    except Exception as e:
        print(f"发生未知错误: {e}")

# 定义JSON字符串
json_string_data_example = """\
[
{"any": 2023},
{
"dia": 24,
"mes": 1,
"any": 2023,
"mes_referencia": 12,
"any_referencia": 2022,
"calendari_nom": "CCC"
},
{
"dia": 4,
"mes": 12,
"any": 2023,
"mes_referencia": 10,
"any_referencia": 2023,
"calendari_nom": "FFF"
}
]"""

# 调用函数进行拆分
split_json_string(json_string_data_example)
登录后复制

代码解析: 此场景与从文件读取的主要区别在于使用了 json.loads() 函数。

  • json.loads(json_string_data): 这个函数用于将JSON格式的字符串解析为Python对象。 其余的文件写入和迭代逻辑与场景一完全相同。

注意事项

  1. JSON根元素类型: 本教程的方法适用于JSON文件的根元素是一个数组([...])的情况。如果根元素是单个对象({...}),则没有可迭代的子对象进行拆分。
  2. 文件名生成: 示例中使用 f"data_out_{i}.json" 来生成唯一的文件名。在实际应用中,您可能需要根据JSON对象中的某个特定字段来命名文件,例如 item['id']。
  3. 错误处理: 务必包含 try-except 块来处理文件不存在、JSON格式错误等异常情况,提高程序的健壮性。
  4. 编码: 在读写文件时,明确指定 encoding="utf-8" 是一个好习惯,尤其是在处理包含非ASCII字符(如中文)的数据时,可以避免乱码问题。
  5. 内存管理: 对于包含数百万甚至数十亿个JSON对象的大型文件,一次性将整个文件加载到内存中(json.load() 或 json.loads())可能会导致内存溢出。在这种情况下,您可能需要考虑使用流式JSON解析库(如 ijson)来逐个读取JSON对象,而不是一次性加载全部数据。
  6. 输出目录: 始终确保输出目录存在,或在代码中自动创建,以避免 FileNotFoundError。

总结

通过Python的json模块,我们可以非常方便地将包含JSON对象数组的文件或字符串数据拆分为多个独立的JSON文件。无论是从磁盘文件加载还是从内存中的字符串加载,核心思想都是将JSON数据解析为Python列表,然后遍历该列表,将每个字典对象单独序列化并保存。结合适当的错误处理和文件命名策略,这种方法是处理和管理大量结构化JSON数据的有效手段。

以上就是使用Python高效拆分JSON数组为多个独立文件的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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