使用Klepto进行Python保存和编辑

时间:2015-03-26 03:46:36

标签: python dictionary pickle klepto

好的,所以我的问题很具体,我提前道歉。我是一名新程序员,并尝试从头开始自己开发。只有我有最后一个问题才能相对成功,我可以看到。您可以在此处完整查看我的代码。

Project

所以我遇到的问题与我保存文件的方式有关。我第一次尝试腌制它,因为它是一本字典,但我一直收到错误,因为我的字典是
(名称,类)对。

我在这里搜索过,看到我可以尝试JSON来做同样的事情。结束了同样的错误。最终我找到了klepto模块。我成功保存了我的字典并成功加载了它。直到后来我才发现我可以在文件中添加新项目,但每当我从我的dict中删除一些内容并保存时。下次我加载它。我删除的密钥仍在那里。

TLDR:可以在我的dict中添加一些内容并保存到txt文件,但是当我从dict中删除并保存它时,不会保存删除的密钥。

无论如何,我在我保存文件的方式或我加载文件的方式或两者兼顾的问题上难以理解?任何帮助都将非常感激。

编辑:好的,我假设它是我现在设置为保存和加载的方式。

try:
    alcohols = file_archive('Alcohols.txt')
    alcohols.load()
except IOError:
    alcohols = {}
    print('alcohols doesn\'t exist.')

print('Exiting and saving the data.')
        alcohols.dump('Alcohols.txt') #saves the dictionary data as is

它在添加新项目时保存了字典,但是说我必须进行编辑并删除一些内容然后保存并退出。下次加载它会有旧项目和任何新项目。奇怪的是,我似乎在所有编辑中都破坏了一些东西。不保存新条目。

EDIT2:

                del alcohols[name] #deletes the key out of the dict

这是我删除密钥的方法。最初我使用的是pop方法,但是当它不能保存更改时我试过这个。作为一个注释,它可以从字典中删除它们的键值,但保存和重新加载不会反映出这种变化。

                alcohols[name] = Alcohol() #instantiates the new class

这就是我创建新的键值对的方式。

求助编辑:

我的问题在于我从字典中删除它们的方式。万一有人后来绊倒了。看看@Mike Mckerns的回答。不得不从存档的字典中删除。

1 个答案:

答案 0 :(得分:3)

基本上,您要从“内存中”缓存中删除,而不是从“文件”缓存中删除。默认情况下,klepto存档会为您提供“内存中”缓存,您可以直接通过dict界面使用它,它还会为您提供archive作为后端。

因此,当您dump时,您将内存中的项目传输到后端。 要从缓存和存档中删除,您必须从两者中删除。

>>> from klepto.archives import *
>>> arch = file_archive('foo.txt')
>>> arch['a'] = 1
>>> arch['b'] = 2
>>> # look at the "in-memory" copy
>>> arch
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # look at the "on-disk" copy
>>> arch.archive
file_archive('foo.txt', {}, cached=False)
>>> # dump from memory to the file
>>> arch.dump()
>>> arch.archive
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=False)
>>> arch 
file_archive('foo.txt', {'a': 1, 'b': 2}, cached=True)
>>> # delete from the in-memory cache
>>> arch.pop('a')
1
>>> # delete from the on-disk cache
>>> arch.archive.pop('a')
1
>>> arch
file_archive('foo.txt', {'b': 2}, cached=True)
>>> arch.archive
file_archive('foo.txt', {'b': 2}, cached=False)

我想我可以在单个函数调用中更容易从两者中删除...