python必背源代码读写JSON文件代码

小石头
小石头
发布时间:2026-11-15| 2人浏览过
原创

提供Python读写JSON文件必背的标准源代码与规范写法,系统辨析json.dump、json.load、json.dumps与json.loads的核心机制差异,详解UTF-8编码防乱码、排版缩进、类型映射及生产环境避坑指南。

在 Python 中读写 JSON 文件的核心方案只有两套标准操作:写入文件使用 json.dump(),读取文件使用 json.load()。借助标准库内置的 json 模块与 with open 自动上下文管理,不仅代码精炼,而且能确保文件句柄安全释放。掌握以下两套必背源代码及关键参数配置,即可直接解决日常开发中 95% 以上的数据持久化与配置读取需求。
python必背源代码读写JSON文件代码
图 1:Python 读写 JSON 核心操作全景(内存对象与磁盘文件双向交互)

一、最简必背模板:写入与读取两套完整代码

日常编写脚本、爬虫落盘或管理本地配置文件时,推荐直接套用以下两段标准源代码。代码中包含中文字符支持、层级缩进与 UTF-8 编码设置,完全符合生产代码的规范要求。

1. 写入 JSON 文件的完整源代码

向磁盘写入 JSON 数据时,核心函数是 json.dump()。必须以写模式("w")打开目标文件,并显式指定 encoding="utf-8" 规避字符集兼容问题。

import json

# 1. 准备待保存的数据(支持字典嵌套、列表、布尔值及中文)
config_data = {
    "app_name": "自动化监控平台",
    "version": "1.2.0",
    "is_active": True,
    "max_connections": 100,
    "notify_emails": ["admin@example.com", "ops@example.com"],
    "settings": {
        "timeout": 30,
        "retry": 3
    }
}

# 2. 写入 JSON 文件(必背关键模板)
with open("config.json", mode="w", encoding="utf-8") as f:
    json.dump(config_data, f, ensure_ascii=False, indent=4)

print("JSON 文件写入成功!")
生成的 config.json 示例内容:
{
    "app_name": "自动化监控平台",
    "version": "1.2.0",
    "is_active": true,
    "max_connections": 100,
    "notify_emails": [
        "admin@example.com",
        "ops@example.com"
    ],
    "settings": {
        "timeout": 30,
        "retry": 3
    }
}

2. 读取 JSON 文件的完整源代码

从磁盘加载已存在的 JSON 文件时,使用 json.load()。以读模式("r")打开文件后直接传入文件句柄,模块会自动将其解析为 Python 原生字典或列表。

import json

# 读取并解析 JSON 文件(必背关键模板)
with open("config.json", mode="r", encoding="utf-8") as f:
    loaded_data = json.load(f)

# 输出读取后的数据及其类型
print("读取成功,数据类型:", type(loaded_data))
print("系统名称:", loaded_data["app_name"])
print("重试次数:", loaded_data["settings"]["retry"])
终端运行示例输出:
读取成功,数据类型: <class 'dict'>
系统名称: 自动化监控平台
重试次数: 3
python必背源代码读写JSON文件代码
图 2:JSON 文件读写标准化 4 步执行流(数据准备、上下文管理、序列化与异常容错)

二、核心方法辨析:dump/load 与 dumps/loads 关键差异

很多初学者容易混淆 dump/load 与 dumps/loads。两者的核心差异在于操作的数据载体不同:一个是针对文件流(File-like Object),另一个是针对内存中的字符串(String)。

函数名 末尾含义 接受/返回的核心对象 主要适用场景
json.dump(obj, fp) 无 s 接受 Python 对象与文件句柄 fp 将数据直接序列化并写入磁盘文件
json.load(fp) 无 s 接受文件句柄 fp,返回 Python 对象 直接从磁盘文件中反序列化读取数据
json.dumps(obj) 带 s (String) 接受 Python 对象,返回 str 字符串 内存数据转字符串,用于 API 返回或网络传输
json.loads(s) 带 s (String) 接受 str 字符串,返回 Python 对象 解析网络请求体、Redis 缓存或日志文本
为什么这一差异至关重要?

若将内存字符串误传给 json.load("..."),程序会立即崩溃并抛出 AttributeError: 'str' object has no attribute 'read',因为 load 内部要求参数必须具备 .read() 方法的文件对象;反之,若把文件对象传给 json.dumps(f),则会报错 TypeError: Object of type TextIOWrapper is not JSON serializable。记住规律:操作文件用不带 s 的,操作字符串用带 s 的。

python必背源代码读写JSON文件代码
图 3:文件流操作 (dump/load) 与内存字符串操作 (dumps/loads) 机制对比

三、类型转换规则:Python 数据结构与 JSON 标准映射

JSON 是一种跨语言的数据交换规范,并非所有 Python 原生类型都能无缝映射。理解双向转换过程中的类型对齐规则,能有效预防字段取值异常与序列化报错。

  • 字典与对象:Python 的 dict 严格转换为 JSON 的 object。需要特别注意:JSON 规范要求对象的键(Key)必须是双引号字符串;如果 Python 字典的键是整数或浮点数,在执行 dump 后键会被强制转换为字符串。
  • 元组与列表的单向性:Python 中的 list 与 tuple 都会被序列化为 JSON 的 array(方括号 [])。但是在反序列化(json.load)时,JSON 数组会统一恢复为 Python 列表(list),原本的元组不可变特性不会保留。
  • 布尔值与空值转换:Python 的 True / False 映射为 JSON 的小写 true / false;Python 的 None 对应 JSON 的 null。
python必背源代码读写JSON文件代码
图 4:Python 原生数据类型与 JSON 标准规范双向映射对照

对于 Python 标准库中常见的特殊类型(如 datetime 日期时间对象、set 集合或自定义类的实例),标准 json 模块默认无法识别,会抛出 TypeError: Object of type ... is not JSON serializable。应对方案通常是在写入前手动转为字符串/列表,或在 dump 中传入 default=str 自定义转换函数:

from datetime import datetime
import json

log_entry = {
    "timestamp": datetime.now(),
    "unique_tags": {"python", "json", "backend"}  # set 集合
}

# 使用 default=str 将无法识别的对象自动转为字符串格式
with open("log.json", "w", encoding="utf-8") as f:
    json.dump(log_entry, f, ensure_ascii=False, indent=2, default=str)

四、生产环境必背参数与三大避坑要点

在实际工程代码中,仅仅调用 json.dump(data, f) 往往无法达到生产级健壮要求。以下四大参数与防坑要点是编写高质量代码的关键。

python必背源代码读写JSON文件代码
图 5:JSON 读写生产级核心参数与避坑防线速查表

1. 避开中文乱码陷阱:ensure_ascii=False 与 encoding="utf-8" 双保险

json.dump() 的参数 ensure_ascii 默认值为 True。如果保持默认设置,所有非 ASCII 字符(包括中文字符)都会被自动转义为 Unicode 编码形式(如 中文)。虽然反序列化时能正常解析,但直接查看文件时人类无法阅读,且增加了存储体积。

标准做法:必须同时满足两个条件——open() 时指定 encoding="utf-8",且 dump() 时指定 ensure_ascii=False,两者缺一不可。只设置 ensure_ascii=False 而未指定 UTF-8 编码,在 Windows 系统下可能按系统默认的 GBK 编码写入,进而引发乱码或崩溃。

2. 美化排版与存储体积的平衡:indent 参数的合理选择

indent 控制 JSON 输出时的缩进空格数:

  • 本地调试与配置文件(indent=4 或 indent=2):自动换行并缩进,极大方便运维与开发人员查阅、修改配置。
  • 网络传输与海量日志(不传 indent 或 indent=None):输出紧凑的单行压缩 JSON,没有多余的空格与换行符,能减少 30% 到 50% 的文件体积,节约磁盘 I/O 与传输带宽。

3. 异常容错机制:捕获 FileNotFoundError 与 JSONDecodeError

读取外部文件属于高危 I/O 操作。若文件不存在会引发 FileNotFoundError;若文件内容为空(0 字节)或被意外修改破坏了结构(例如缺少闭合大括号),json.load() 会抛出 json.decoder.JSONDecodeError。生产代码中应当使用 try-except 结构妥善包裹:

import json
from json.decoder import JSONDecodeError

def safe_load_config(file_path, default_config=None):
    """安全读取 JSON 配置,带完备的容错降级机制"""
    if default_config is None:
        default_config = {}
    
    try:
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        print(f"提示:文件 {file_path} 不存在,返回默认配置。")
        return default_config
    except JSONDecodeError as err:
        print(f"警告:文件 {file_path} 格式损坏({err}),返回默认配置。")
        return default_config

五、实战范式:配置文件的“读取-修改-回写”完整代码

在实际业务中,最频繁的组合需求是先读取旧文件,对其中的部分配置项进行更新,然后重新写回磁盘。这里给出可以直接套用的工业级实战脚本:

import json
import os

CONFIG_FILE = "user_settings.json"

# 1. 初始化或安全读取现有数据
if os.path.exists(CONFIG_FILE):
    with open(CONFIG_FILE, "r", encoding="utf-8") as f:
        try:
            settings = json.load(f)
        except json.JSONDecodeError:
            settings = {}
else:
    settings = {}

# 2. 修改业务字段(若字段不存在则自动创建,存在则覆盖更新)
settings["last_login"] = "2026-11-11 18:00:00"
settings["login_count"] = settings.get("login_count", 0) + 1
settings["theme"] = "dark"

# 3. 规范写回文件
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
    json.dump(settings, f, ensure_ascii=False, indent=4)

print(f"配置更新完成!当前登录次数: {settings['login_count']}")
执行后的 user_settings.json 内容验证:
{
    "last_login": "2026-11-11 18:00:00",
    "login_count": 1,
    "theme": "dark"
}
小结记忆卡片:
  1. 写文件:with open(..., "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4)
  2. 读文件:with open(..., "r", encoding="utf-8") as f: data = json.load(f)
  3. 牢记口诀:文件直连无 s,内存转串必带 s;中文防乱码,utf-8 配 ensure_ascii=False。
相关专题:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。