2017-01-15 41 views
0

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

我尝试将它保存这样的: “名称”为地图 “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() 

回答

1

你需要打开你的文件,writeback=True::那是吹

继承人我的代码风量

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

docs

因为Python的语义,当可变持久字典项被修改的架子不知道。默认情况下,修改后的对象仅在分配给货架时才写入(请参阅示例)。 如果可选writeback参数设置为True,则所有访问的条目也会缓存在内存中,并写回sync()close();这可以使更改持久性字典中的可变条目更容易,但是,如果访问了很多条目,它可能会消耗大量的缓存内存,并且它可以使关闭操作非常缓慢,因为所有访问的条目都被写回(没有办法确定哪些访问条目是可变的,哪些实际上是变异的)。

+0

谢谢,我会尽力的。 – Jerrynicki

1

shelve将写出修改键,当你设置键。它无法检测到值的更改。追加到列表或分配给值为的字典上的密钥将不会被检测到。

shelve documentation:当一个可变的持久字典词条被修改

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

大胆强调我的。

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

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

或分配回明确的关键:

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