我的知识记录

Python写入JSON文件教程:json.dump中文不转义

用Python标准库json把dict/list写入JSON文件,解决中文被转义成\uXXXX的问题,支持缩进美化、原子写入,附完整代码。

场景痛点

把Python字典存成JSON给前端、给下游系统用,结果打开一看中文全变成 \u4f60\u597d,机器能读人看不懂;或者写一半程序崩了,文件只剩一半,下游解析直接挂。这篇讲清楚正确写JSON的姿势。

用到的库

# 纯标准库,无需pip安装

完整代码

# 用Python写入JSON文件
import json
import os
import tempfile

def write_json_pretty(file_path, data):
"""
美化格式写JSON:缩进2空格、中文不转义、按key排序。
适合给人看的配置文件、导出文件。
"""
with open(file_path, "w", encoding="utf-8") as f:
json.dump(
data,
f,
ensure_ascii=False,   # 关键:中文不转义成\uXXXX
indent=2,             # 缩进美化
sort_keys=True,       # key按字典序排序,便于diff
separators=(",", ": "),
)
print(f"美化写入完成:{file_path}")

def write_json_compact(file_path, data):
"""
紧凑格式写JSON:不缩进、无空格,体积小,适合传输存储。
"""
with open(file_path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, separators=(",", ":"))
size = os.path.getsize(file_path)
print(f"紧凑写入完成:{file_path},{size} 字节")

def write_json_atomic(file_path, data):
"""
原子写入:先写到临时文件,写完再rename,避免写一半崩了留下坏文件。
重要数据建议用这种方式。
"""
dir_name = os.path.dirname(file_path) or "."
with tempfile.NamedTemporaryFile(
"w", encoding="utf-8", dir=dir_name, delete=False, suffix=".tmp"
) as tmp:
json.dump(data, tmp, ensure_ascii=False, indent=2)
tmp.flush()
os.fsync(tmp.fileno())  # 强制刷盘
os.replace(tmp.name, file_path)  # 原子替换
print(f"原子写入完成:{file_path}")

def main():
data = {
"name": "张三",
"age": 28,
"city": "北京",
"tags": ["技术", "Python", "数据"],
"is_vip": True,
"score": 95.5,
"extra": None,
}

write_json_pretty("config_pretty.json", data)
write_json_compact("config_compact.json", data)
write_json_atomic("config_atomic.json", data)

if __name__ == "__main__":
main()

代码讲解

  • ensure_ascii=False 是解决中文乱码的关键,默认 True 会把所有非ASCII字符转成 \uXXXX
  • indent=2 让文件带缩进美化,人眼可读;不传就紧凑一行。
  • sort_keys=True 让输出稳定,多次运行diff不会因为key顺序不同而误判变化。
  • 原子写入:先写 .tmp 临时文件,fsync刷盘后 os.replace 原子替换,任何时刻目标文件都是完整的。
  • separators 控制分隔符,紧凑模式下去掉空格省体积。

运行结果

当前目录生成三个JSON文件:config_pretty.json 带缩进、中文正常;config_compact.json 一行紧凑格式;config_atomic.json 内容和pretty版一致。用记事本或VSCode打开都能直接看到中文。

注意事项

  • JSON只能放基础类型(str/int/float/bool/None/list/dict),datetime、自定义对象要先转字符串。
  • 写嵌套很深的dict时,json.dump 会自动递归,不用自己处理。
  • 原子写入在Windows上 os.replace 要求目标不存在,重复运行前先删旧文件或确保覆盖逻辑。
  • 读回来用 json.load(open(path, encoding="utf-8")),编码要对上。

Python写入JSON文件教程:json.dump中文不转义

标签:

更新时间:2026-09-14 20:53:32

上一篇:Python调用API查询汇率:人民币美元换算与批量计算

下一篇:Python写入CSV文件教程:csv模块与pandas两种写法