json 创建一个列表,每次运行程序时都不会更新

ktca8awb  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(126)

我是一个Python新手,试图制作一个程序,通过编译一个表单来创建JSON列表,感谢tk库,并将其写在一个.json文件中。但是我使用了一个错误的逻辑,每次我重新运行程序,它都按照我的要求写了一个新的JSON,但是它删除了写在那个文件上的旧的JSON。

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("This is what's in the list", 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)

下面是我尝试将已经存在的.json文件保存在Python变量中以检查它是否为空的测试的一部分。不知道对不对。我还想也许我必须处理两个.json文件。

with open("interest.json",'r') as filetoread:
            
        transform_json = json.loads(filetoread)

        if len(transform_json) < 1:
            with open("interest.json",'w', encoding='utf-8') as f:
                json.dump(getdata,f,ensure_ascii=False, indent = 2)
        else:
            # put a condiction to keep writing on the same file if that already exist

我希望我没有选择最糟糕的方式。谢谢你的帮助

31moq8wy

31moq8wy1#

你可以在这里参考答案:
Difference between modes a, a+, w, w+, and r+ in built-in open function?
"w"会截断你的文件,你需要使用"a"
open('file.json', 'a')

68bkxrlz

68bkxrlz2#

import json
import os

transform_json = None
getdata = {"test1":"value"}
if os.path.isfile("interest.json"):
    with open("interest.json", 'r') as filetoread:
        try:
            transform_json = json.load(filetoread)
        except Exception:
            pass

if not transform_json:
    with open("interest.json", 'w', encoding='utf-8') as f:
        json.dump(getdata, f, ensure_ascii=False, indent=2)
else:
    combined_data = {**transform_json, **getdata}

    with open("interest.json", 'w', encoding='utf-8') as f:
        json.dump(combined_data, f, ensure_ascii=False, indent=2)

使用您的代码,您可以沿着做一些事情打开您的文件,如果它存在,将json加载到transform_json中作为字典,否则什么都不做
然后检查transform_json是否存在(首先检查文件是否存在)。如果它不存在,则创建文件并在其中添加值,否则,如果它存在(因此transform_json在其中具有值),则将transform_jsongetdata合并(以创建单个字典),然后在json文件中添加dump_it以覆盖先前存在的json
try except是在你的json文件无效的情况下(空文件或坏的json文件),然后你覆盖它,如果这不是你想要的行为(例如,如果json不正确,你想做一些事情,做它而不是pass

相关问题