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

Python程序运行时JSON列表被覆盖,如何保留历史数据?

解决JSON写入覆盖历史数据的问题

核心思路是程序启动时先加载已有数据,让getdata列表包含历史记录,新增数据后再整体写入文件,这样就不会覆盖原有内容。

步骤说明

  1. 程序初始化时,尝试读取interest.json文件,把历史数据加载到getdata列表中
  2. 处理文件不存在、文件为空的异常情况
  3. 提交数据时,将新数据追加到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格式错误)

对你测试代码的问题说明

你之前的测试代码有两个问题:

  1. 使用json.loads(filetoread)是错误的,json.loads接收字符串,读取文件应该用json.load(filetoread)
  2. 追加写入JSON文件会导致格式错误(比如两个列表放在一起,不符合JSON语法),正确做法是加载全部数据,新增后整体覆盖写入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:30:36