Python 中如何把 JSON 数据写入文件?
Python 写 JSON 文件:json.dump(data, file) 直接写入;常用参数 indent=4 美化、ensure_ascii=False 保留中文。本文介绍完整写法及读取方式。
用 json.dump(data, f):打开文件后以写模式传入文件对象即可。常用参数:indent=4 美化格式、ensure_ascii=False 保留中文原文。
基本写法
import json
data = {
"name": "张三",
"age": 35,
"city": "杭州"
}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
with语句自动关闭文件;ensure_ascii=False让中文直接写入(默认会转成\uXXXX);indent=4让文件内容带缩进、人可读;省略时通常单行,但仍有默认分隔空格;需要更紧凑可用 separators=(',', ':')。
严格 JSON 可设置 allow_nan=False,拒绝 NaN/Infinity 等非标准数值。读回也不保证所有 Python 类型原样恢复,例如元组变为列表、字典非字符串键变为字符串。
读回来
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["name"]) # 张三
dump 与 dumps 的区别
json.dump(data, f) # 直接写入文件对象
json.dumps(data) # 返回 JSON 字符串,自己决定写哪
一行一个 JSON 对象(JSONL)
日志/数据流场景常用 JSON Lines 格式:
with open("data.jsonl", "w", encoding="utf-8") as f:
for record in records:
f.write(json.dumps(record, ensure_ascii=False) + "\n")
常见问题(FAQ)
Q:写入中文变成 \u4e2d\u6587?
A:加 ensure_ascii=False,并确保文件以 encoding="utf-8" 打开。
Q:datetime 对象不能直接 dump?
A:对,JSON 不支持日期类型。先转字符串:data["time"] = dt.isoformat();或自定义 encoder。
Q:文件已存在会怎样?
A:"w" 在打开时就截断原文件,即使后续序列化失败也可能丢失旧内容;重要数据应写临时文件并完成验证后原子替换。追加用 "a"(适合 JSONL 格式,普通 JSON 文件追加会产生非法内容)。