You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python操作JSON文件时常变空的问题排查求助

分析:cam_settings.json 偶尔变为空文件的原因

导致文件不定期变空的核心问题在于当前代码的写入逻辑存在风险——用'w'模式打开文件时会直接清空原有内容,一旦后续写入环节出问题,就会留下空文件。具体可能的触发场景:

  • 写入中途异常中断:程序在执行json.dump时突然崩溃、被系统强制终止(比如内存占用过高被kill)、设备断电,都会导致文件被清空后无法完成写入,最终变成0字节。
  • 并发操作冲突:如果程序有多个线程/进程同时调用这个修改方法,就可能出现竞态:比如线程A刚读完文件,线程B用'w'打开清空了文件,线程A后续写入时因异常失败,最终文件为空。
  • JSON序列化失败:如果value是JSON无法序列化的类型(比如自定义类实例、循环引用对象),json.dump会抛出异常,此时文件已经被清空,自然会变成空文件。
  • 存储设备IO异常:硬盘、SD卡等存储介质出现临时读写错误,导致写入操作中途失败,文件停留在清空后的状态。

改进建议:用临时文件替换原文件

直接修改原文件的风险太高,建议先写入临时文件,确认写入成功后再替换原文件,避免原文件被破坏:

import json
import os
import shutil

def edit_default_settings(self, setting_type, value):
    settings_path = "cam_settings.json"
    temp_path = "cam_settings.tmp"
    
    # 读取原配置
    with open(settings_path, "r") as f:
        cam_settings = json.load(f)
    
    cam_settings[setting_type] = value
    
    try:
        # 先写入临时文件
        with open(temp_path, 'w') as f:
            json.dump(cam_settings, f, indent=4)
        # 验证临时文件的有效性(可选但推荐)
        with open(temp_path, 'r') as f:
            json.load(f)
        # 替换原文件
        shutil.move(temp_path, settings_path)
    except Exception as e:
        # 出错时清理临时文件
        if os.path.exists(temp_path):
            os.remove(temp_path)
        raise e  # 按需处理异常,比如记录日志

额外补充:如果是多线程/进程场景,需要给文件操作加锁,避免并发修改冲突;同时可以在代码中增加日志,记录每次修改的时间和内容,方便后续排查问题。

内容的提问来源于stack exchange,提问作者Pavlo Sharhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:17