将字典保存到文件 Python Tkinter

Save dictionary to file Python Tkinter

初次张贴者/编码新手,使用 Python3、Tkinter 和 Pickle。

对于我正在进行的项目,我设计了一个随机膳食生成器,它使用用户输入的成分并确定可以烹制哪些膳食。除了能够保存和打开成分字典外,一切都正常。

基本上我想要的是让用户能够保存他们的成分并使用文件对话框打开该文件。

这是我为保存食谱列表而编写的示例代码:

def save_Recipe():
    file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))

    if file_name:
        if file_name.endswith(".dat"):
            pass
        else:
            file_name = f"{file_name}.dat"
    # Grab all stuff from recipe list
    lrl= len(recipe_list)
    stuff = recipe_list[0:lrl]
    # Open the file
    output_file = open(file_name, "wb")
    # Actually add the stuff to the file
    pickle.dump(stuff, output_file)

def open_Recipe():
    file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))

    if file_name:
        # Delete currently open list
        display_recipe.delete(0,END)

        #Open the file
        input_file = open(file_name, "rb")

        #Load the data from the file
        stuff = pickle.load(input_file)

        #Output stuff to the screen
        n = 0
        for item in stuff:
            if item not in recipe_list:
                recipe_list.insert(n, item)
            n += 1
        
        display_recipe_update()

这些功能通过菜单按钮访问。但我不知道如何用我的成分字典做同样的事情。示例 = {ingredient_name : num_of_ingredient}, {面包:2, 奶酪: 1}.

def save_ingredients():
    global ingredients
    global stuff2
    file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))

    if file_name:
        if file_name.endswith(".dat"):
            pass
        else:
            file_name = f"{file_name}.dat"
    # Grab all stuff from ingredients
    stuff2 = ingredients.get(0,END)
    
    input_file = open(file_name, 'wb')
    pickle.dump(stuff2, input_file, protocol=pickle.HIGHEST_PROTOCOL)
    input_file.close() 

def open_ingredients(): 
    file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))

    if file_name:
        # Delete currently open list
        input_file = open(file_name, 'rb')
        output_file = pickle.load(input_file)
        print(output_file)
        input_file.close()

我想要的是保存的文件原样包含字典中的所有信息。这是我的测试成分字典的示例。

ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}

程序在多个函数中使用此字典来确定哪些食谱(个人制作的 class 对象)可用。它通过遍历成分字典,找到与存储在食谱中的成分相匹配的键,并看到键的值 >= 配方中所需的成分数。

保存和打开字典时发生的事情是我可以保存文件和打开文件而不会出现任何错误。但是当我打印成分字典时它仍然是空的。

我的问题是如何将字典保存到文件中,然后当我打开该文件时字典将填充我保存在文件中的任何内容?

两天来我一直在查看 Whosebug,尝试我能看到的所有内容,但 none 它正在运行。任何建议将不胜感激!

保存 dict 的最简单方法是使用 json

import json

ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}

filename = 'path/to/file.txt'

#save file
with open(filename, 'w') as f:
    f.write(json.dumps(ingredients))

#load file
with open(filename, 'r') as f: 
    ingredients_from_file = json.load(f)

json 还具有 human-readable 的优势,它可以帮助您诊断代码中的任何错误。

据我所知,您存储和读取数据的代码应该没问题。正如@Pepsi-Joe 所建议的,您可以使用 JSON 而不是 pickle 将数据保存到磁盘,因为它比 pickle 更安全、更便携。另一个建议是通常使用 with 语句打开文件以避免过时的文件句柄,例如:

with open("/path/to/file", 'r') as fh:
    data = fh.readlines()

要调试此问题,我建议您打开交互式 Python 控制台,读取并存储文件。或者使用调试器查看写入的内容 (stuff2) 并读取内容。也许这是您的 UI 代码中的错误?

如果您的 ingredients 与您描述的一样,我想 ingredients.get(0, END) 可以 return None,然后将其保存到文件中。因此,该文件包含“无”,当您阅读它时会返回。把那行删掉,直接保存ingredients就可以了。