用 Python 安全地更新 JSON 配置文件

举报
yd_251192881 发表于 2026/11/01 18:28:50 2026/11/01
【摘要】 使用临时文件和 os.replace 更新 JSON 配置,说明异常清理、并发写入和断电恢复的边界。

脚本保存配置时,如果直接覆盖目标文件,程序在写入途中退出,文件可能只剩一部分内容。对于同一文件系统中的普通配置文件,可以先写入临时文件,确认写入完成,再用 os.replace 替换目标文件。

下面的示例把临时文件放在目标目录中,避免跨文件系统重命名。写入失败时,它会尝试删除临时文件,并保留原来的目标文件。

import json
import os
import tempfile
from pathlib import Path


def write_json(path: Path, data: dict) -> None:
    path = Path(path)
    path.parent.mkdir(parents=True, exist_ok=True)
    temp_path = None
    try:
        with tempfile.NamedTemporaryFile(
            mode="w", encoding="utf-8", dir=path.parent,
            prefix=f".{path.name}.", suffix=".tmp", delete=False,
        ) as temp:
            temp_path = Path(temp.name)
            json.dump(data, temp, ensure_ascii=False, indent=2)
            temp.write("\n")
            temp.flush()
            os.fsync(temp.fileno())
        os.replace(temp_path, path)
        temp_path = None
    finally:
        if temp_path is not None:
            temp_path.unlink(missing_ok=True)

调用示例:

from pathlib import Path

write_json(Path("config/settings.json"), {"workers": 4, "enabled": True})

flush 把 Python 缓冲区中的内容交给操作系统;fsync 请求操作系统将文件内容写入存储设备。os.replace 替换目标路径时,读者通常看到旧文件或新文件,而不是写到一半的内容,具体保证仍取决于文件系统。

这个方法不解决多个进程同时更新时的覆盖问题:后完成替换的进程可能覆盖先前结果。若多个进程需要共同修改配置,应增加锁,或使用数据库。它也不保证突然断电后目录项一定持久化;对断电恢复有严格要求时,还需按目标平台的文件系统语义处理目录同步。

替换目标文件可能改变原文件的权限或其他元数据。如果配置文件依赖特定权限,应在替换前设置临时文件的权限,并在目标平台测试。对于含密码的配置,不要把文件或日志提交到公开仓库。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。