Python程序运行时JSON列表被覆盖,如何保留历史数据?
解决JSON写入覆盖历史数据的问题
核心思路是程序启动时先加载已有数据,让getdata列表包含历史记录,新增数据后再整体写入文件,这样就不会覆盖原有内容。
步骤说明
- 程序初始化时,尝试读取
interest.json文件,把历史数据加载到getdata列表中 - 处理文件不存在、文件为空的异常情况
- 提交数据时,将新数据追加到
getdata,再写入整个列表到文件
修正后的完整代码
import json import tkinter as tk # 初始化getdata,加载历史数据 getdata = [] try: with open("interest.json", 'r', encoding='utf-8') as f: # 读取已有数据,文件为空时json.load会报错,所以加异常处理 try: getdata = json.load(f) # 确保加载的数据是列表(防止文件格式错误) if not isinstance(getdata, list): getdata = [] except json.JSONDecodeError: # 文件为空或格式错误时,重置为空列表 getdata = [] except FileNotFoundError: # 文件不存在时,初始化为空列表 getdata = [] def submit(): name = name_var.get() img = img_var.get() description = description_var.get() d = { "name": name, "image": img, "description": description} getdata.append(d) print("当前列表内容:", getdata) # 清空输入框 name_var.set("") img_var.set("") description_var.set("") # 写入完整列表到文件,覆盖原有内容(因为是保存最新的完整数据集) with open("interest.json", 'w', encoding='utf-8') as f: json.dump(getdata, f, ensure_ascii=False, indent=2) # 以下是tkinter界面部分(假设你原有代码的界面定义) root = tk.Tk() name_var = tk.StringVar() img_var = tk.StringVar() description_var = tk.StringVar() # 示例输入框和按钮 tk.Label(root, text="名称").pack() tk.Entry(root, textvariable=name_var).pack() tk.Label(root, text="图片路径").pack() tk.Entry(root, textvariable=img_var).pack() tk.Label(root, text="描述").pack() tk.Entry(root, textvariable=description_var).pack() tk.Button(root, text="提交", command=submit).pack() root.mainloop()
关键修正点
- 启动加载历史数据:不再让
getdata每次启动都是空列表,而是先读取已有文件内容 - 异常处理:处理文件不存在、文件为空、JSON格式错误的情况,避免程序崩溃
- 写入逻辑:提交时写入完整的
getdata列表,替换整个文件(因为JSON文件适合保存完整的数据集,追加写入会导致JSON格式错误)
对你测试代码的问题说明
你之前的测试代码有两个问题:
- 使用
json.loads(filetoread)是错误的,json.loads接收字符串,读取文件应该用json.load(filetoread) - 追加写入JSON文件会导致格式错误(比如两个列表放在一起,不符合JSON语法),正确做法是加载全部数据,新增后整体覆盖写入
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

