Python写入JSON文件保存列表报错、数据清空问题求解
问题原因
你碰到的两个问题都来自文件操作的逻辑错误:
- 抛出
io.UnsupportedOperation: not writable报错:代码开头你用只读模式"r"打开patients.json,赋值给patients_file的文件对象全程只有读权限,save函数里你尝试往这个只读对象写入内容,自然触发权限错误。 - 每次运行原有数据被清空:save函数里写了
open("patients.json", "w")但没有保存返回的可写文件对象,而"w"模式打开文件时会立刻清空原有内容,你打开后既没写入新数据也没关闭文件,原内容直接被清空。 - 隐藏隐患:所有文件打开操作都没有做关闭处理,长时间运行可能出现文件损坏、资源占用异常的问题。
修正步骤
1. 修复初始化读取逻辑
把开头的文件读取代码替换为上下文管理器写法,读完自动关闭文件,同时兼容文件不存在、内容损坏的边界情况:
import json # 读取已有患者数据 try: with open("patients.json", "r", encoding="utf-8") as f: loaded_patients = json.load(f) except (FileNotFoundError, json.JSONDecodeError): # 文件不存在或内容格式错误时初始化空列表 loaded_patients = []
2. 重写save保存函数
替换原有save函数,用写模式打开文件后直接写入数据,写完自动关闭:
def save(): with open("patients.json", "w", encoding="utf-8") as f: # 直接通过json.dump写入数据,不需要手动序列化 json.dump(loaded_patients, f, indent=2, ensure_ascii=False) print("Patient List successfully saved") exit()
可选优化建议
- 你目前通过递归调用
main_menu()实现菜单跳转,用户操作次数多了会触发Python递归深度限制导致崩溃,建议改成while True循环实现菜单逻辑,稳定性更高。 - 所有文件操作都加上
encoding="utf-8"参数,避免Windows系统默认GBK编码导致的乱码问题。 json.dump的indent=2参数可以让保存的JSON文件自动格式化,方便人工查看编辑;ensure_ascii=False可以保证中文内容正常存储,不会转成Unicode编码。
内容的提问来源于stack exchange,提问作者Oran0105
相关产品推荐
相关产品推荐

