Shelve写了空白列表/ dictionarys

时间:2017-01-15 12:28:20

标签: python python-3.x dictionary shelve

我试图制作一个API来为我制作的游戏创建自定义地图,但搁置只是写空白列表和字典。

我尝试将其存储起来: "名称"显示地图名称 " NAME_1"对于被视为变量的名称 "纹理"对于纹理的文件路径 "风"因为吹的风量

继承我的代码:

import tkinter.filedialog as tfd
import shelve
import shutil as os

file1 = shelve.open("info")

if "written" in file1:
    pass
else:
    file1["name"] = []
    file1["name_1"] = []
    file1["textures"] = {}
    file1["wind"] = {}
    file1.close()
    file1 = shelve.open("info")

name = input("Name: ")

name1 = input("Name zur Variablenspeicherung: ")

wind = input("Wind (*-*): ")

print("Wähle eine 1200x820 GIF-Datei als Hintergrund aus")
texture = tfd.askopenfilename()
os.copy(texture,"textures/"+texture.split("/")[-1].split("\\")[-1])
texture = "custom/textures/"+texture.split("/")[-1].split("\\")[-1]

print("Schreibe Datei...")

file1["name"].append(name)
file1["name_1"].append(name1)
file1["textures"][name1] = texture
file1["wind"][name1] = [int(wind.split("-")[0]),int(wind.split("-")[1])]
file1["written"] = 1

file1.close()

2 个答案:

答案 0 :(得分:1)

您需要使用writeback=True打开文件:

file1 = shelve.open("info",  writeback=True)

来自docs

  

由于Python语义,架子无法知道何时修改了可变的持久字典条目。默认情况下,只有在分配给工具架时才会编写修改的对象(请参见示例)。 如果可选的writeback参数设置为True,则所有访问的条目也会缓存在内存中,并在sync()close()上回写; 这可以使其成为可能更容易改变持久字典中的可变条目,但是,如果访问了许多条目,它可能会占用大量内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些是实际变异的。)

答案 1 :(得分:1)

设置该密钥时,

shelve会写出对密钥的更改。它无法检测到值的变化。附加到列表或分配到 value 的字典上的键将不会被检测到。

来自shelve documentation

  

由于Python语义,一个架子无法知道何时修改了可变持久字典条目。默认情况下,只有在分配给工具架时才会编写修改的对象(请参见示例)。如果可选的writeback参数设置为True,则所有访问的条目也会缓存在内存中,并写回sync()close();这可以使持久化字典中的可变条目变得更容易,但是,如果访问了许多条目,它可能会占用大量的内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些实际上是变异的。)

大胆强调我的。

writeback参数设置为True(并接受缺点):

file1 = shelve.open("info", writeback=True)

或明确指定回密钥:

names = file1["name"]
names.append(name)
file1["name"] = names