pin_drop当前位置:知识文库 ❯ 图文

Python json.dump详解 - 文件写入与流式序列化技巧

一、概述

json.dump()json 模块中将 Python 对象序列化为 JSON 格式并直接写入文件对象的函数。与 dumps() 不同,dump() 直接将结果写入文件流,无需在内存中生成完整的 JSON 字符串,因此在处理大型数据时更节省内存。dump() 的参数与 dumps() 基本一致,额外接受一个文件对象参数。


二、语法

代码示例

import json

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True,
           check_circular=True, allow_nan=True,
           cls=None, indent=None, separators=None,
           default=None, sort_keys=False, **kw)

三、参数说明

参数 类型 默认值 说明
obj 任意 必填 要序列化的Python对象
fp 文件对象 必填 支持write()方法的文件对象
skipkeys bool False 跳过非字符串键
ensure_ascii bool True True时转义非ASCII字符
check_circular bool True 检查循环引用
allow_nan bool True 允许NaN/Infinity
cls type None 自定义JSONEncoder子类
indent int/str None 缩进设置
separators tuple (', ', ': ') 分隔符设置
default callable None 不可序列化对象的转换函数
sort_keys bool False 按键排序输出

四、返回值

返回 None。JSON 数据直接写入文件对象,不返回字符串。


五、代码示例

示例1:基本文件写入

代码示例

import json

data = {
    "users": [
        {"id": 1, "name": "张三", "role": "admin"},
        {"id": 2, "name": "李四", "role": "user"},
    ],
    "total": 2,
    "updated": "2024-01-15",
}

# 写入JSON文件
with open("users.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

print("已写入 users.json")

# 读取验证
with open("users.json", "r", encoding="utf-8") as f:
    content = f.read()
print(content)

输出:

代码示例

已写入 users.json
{
  "users": [
    {
      "id": 1,
      "name": "张三",
      "role": "admin"
    },
    {
      "id": 2,
      "name": "李四",
      "role": "user"
    }
  ],
  "total": 2,
  "updated": "2024-01-15"
}

示例2:大数据流式写入

代码示例

import json

def generate_large_data(count):
    """生成大量数据"""
    for i in range(count):
        yield {"id": i, "value": f"item_{i}", "score": i * 0.5}

# 方式1:一次性写入(占用内存大)
data_list = list(generate_large_data(5))
with open("data_batch.json", "w", encoding="utf-8") as f:
    json.dump(data_list, f, ensure_ascii=False, indent=2)
print("批量写入完成")

# 方式2:手动流式写入(节省内存)
with open("data_stream.json", "w", encoding="utf-8") as f:
    f.write("[\n")
    first = True
    for item in generate_large_data(5):
        if not first:
            f.write(",\n")
        json.dump(item, f, ensure_ascii=False, indent=2)
        first = False
    f.write("\n]")
print("流式写入完成")

输出:

代码示例

批量写入完成
流式写入完成

示例3:配置文件管理器

代码示例

import json
import os

class ConfigManager:
    """JSON配置文件管理器"""

    def __init__(self, filepath):
        self.filepath = filepath
        self.config = {}
        if os.path.exists(filepath):
            self.load()

    def load(self):
        """从文件加载配置"""
        with open(self.filepath, "r", encoding="utf-8") as f:
            self.config = json.load(f)

    def save(self):
        """保存配置到文件"""
        with open(self.filepath, "w", encoding="utf-8") as f:
            json.dump(self.config, f, ensure_ascii=False, indent=2)

    def get(self, key, default=None):
        return self.config.get(key, default)

    def set(self, key, value):
        self.config[key] = value
        self.save()

    def delete(self, key):
        if key in self.config:
            del self.config[key]
            self.save()

    def display(self):
        print(f"配置文件: {self.filepath}")
        for key, value in self.config.items():
            print(f"  {key}: {value}")

# 使用示例
config = ConfigManager("app_config.json")
config.set("app_name", "我的应用")
config.set("version", "1.0.0")
config.set("debug", True)
config.set("max_connections", 100)
config.display()

输出:

代码示例

配置文件: app_config.json
  app_name: 我的应用
  version: 1.0.0
  debug: True
  max_connections: 100

六、实际应用场景

  • 数据持久化:将程序运行状态、用户数据保存到 JSON 文件

  • 配置文件管理:读写 JSON 格式的应用配置

  • 大数据导出:将数据库查询结果导出为 JSON 文件


七、注意事项

注意1json.dump() 的文件对象必须支持 write() 方法,且应以文本模式打开("w"),并指定 encoding="utf-8"

注意2dump() 直接写入文件流,不会返回 JSON 字符串。如果需要同时获取字符串和写入文件,应使用 dumps()

注意3:写入文件时应始终使用 with 语句,确保文件正确关闭。

注意4:对于超大文件,dump() 仍需在内存中构建完整的 Python 对象。真正的流式处理需要手动控制写入过程。

提示json.dump()f.write(json.dumps()) 更高效,因为前者直接写入文件流,避免了中间字符串的内存分配。


八、相关方法对比

特性 json.dump() json.dumps() f.write(json.dumps()) pickle.dump()
输出目标 文件对象 字符串 文件 文件
内存效率 较高 较低 最低 较高
返回值 None str 写入字节数 None
格式 JSON JSON JSON 二进制
跨语言
适用场景 文件存储 网络传输 不推荐 Python专属

九、小结

  • json.dump() 将 Python 对象直接序列化写入文件,比 dumps() + write() 更高效

  • 参数与 dumps() 一致,额外需要文件对象参数

  • 处理中文时需设置 ensure_ascii=False,美化输出使用 indent

  • 大数据场景可手动实现流式写入,避免一次性加载全部数据到内存


十、练习题

练习1

编写一个函数 export_to_json(data, filepath),将数据导出为 JSON 文件,自动创建不存在的目录。

练习2

编写一个函数,将列表数据分批写入 JSON 文件,每批1000条,使用手动流式写入方式。

练习3

编写一个函数,比较 json.dump()f.write(json.dumps()) 在写入大文件时的内存占用差异。

小贴士

json.dump()fp 参数不仅可以是文件对象,也可以是任何实现了 write() 方法的对象,例如 io.StringIO、网络 socket 流、HTTP 响应流等。这使得 dump() 非常灵活,可以适应各种输出目标,而不局限于本地文件。

常见问题

json.dump() 和 json.dumps() 应该选哪个?

如果目标是将 JSON 写入文件,优先使用 dump(),它更节省内存;如果需要将 JSON 作为字符串用于网络传输、API 响应或进一步处理,使用 dumps()。

为什么写入文件时要指定 encoding="utf-8"?

不同操作系统默认编码可能不同(Windows 默认 GBK)。显式指定 utf-8 可以确保中文等非 ASCII 字符正确写入文件,避免跨平台编码问题。

如何实现真正的流式 JSON 写入?

json.dump() 本身不支持流式写入生成器。真正的流式写入需要手动控制:先写 [,然后逐个 dump 每个元素并手动添加逗号分隔,最后写 ]。或者使用第三方库如 ijson 来实现。

json.dump() 比 f.write(json.dumps()) 快多少?

对于小数据差异不明显。对于大数据(MB级别),dump() 避免了中间完整字符串的内存分配,可以减少约 50% 的内存峰值。速度方面两者接近,dump() 略优,因为少了一次字符串拼接操作。

标签: json.dump 文件写入 数据持久化 流式写入 配置文件 内存优化

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python json.loads详解 - JSON解码与自定义解析技巧 下一篇: json.load详解 - Python从文件读取JSON数据完整指南

poll相关推荐