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
相关产品推荐
相关产品推荐

