用klepot保存和编辑Python

用klepot保存和编辑Python,python,dictionary,pickle,klepto,Python,Dictionary,Pickle,Klepto,好的,我的问题很具体,我提前道歉。我是一个新的程序员,并且尝试从头开始自己开发。这是相对成功的,只有最后一个问题,我可以看到。您可以在这里完整地查看我的代码 所以我遇到的问题与我保存文件的方式有关。我第一次尝试对它进行pickle,因为它是一本字典,但我不断地出错,因为我的字典是 (名称、类别)对 我在这里四处搜索,发现我可以尝试JSON做同样的事情。最后也犯了同样的错误。最终我找到了工作正常的KLEPOT模块。我成功地保存了词典并成功地加载了它。直到后来我才发现,我可以向文件中添加新项目,但

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

所以我遇到的问题与我保存文件的方式有关。我第一次尝试对它进行pickle,因为它是一本字典,但我不断地出错,因为我的字典是
(名称、类别)对

我在这里四处搜索,发现我可以尝试JSON做同样的事情。最后也犯了同样的错误。最终我找到了工作正常的KLEPOT模块。我成功地保存了词典并成功地加载了它。直到后来我才发现,我可以向文件中添加新项目,但每当我从dict中删除某些内容并保存时。下次我加载它时。我取下的钥匙还在那里

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

不管怎么说,我被困在哪里,我的问题在于我保存文件的方式,或者我加载文件的方式,或者两者兼而有之?任何帮助都将不胜感激

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

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

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

编辑2:

                del alcohols[name] #deletes the key out of the dict
我就是这样取下钥匙的。最初我使用的是pop方法,但当它无法保存更改时,我尝试了这个方法。值得注意的是,它确实从字典中删除了它们的键、值,但保存和重新加载并不能反映这种变化

                alcohols[name] = Alcohol() #instantiates the new class
这就是我如何创建新的键、值对的方法

已解决的编辑:


我的问题是我从字典中删除它们的方式。以防以后有人无意中进入这里。看看@Mike Mckerns的答案。必须从存档字典中删除。

基本上,您是从“内存”缓存中删除,而不是从“文件”缓存中删除。默认情况下,
klepot
存档为您提供“内存中”缓存,您可以直接通过dict接口使用该缓存,它还为您提供一个作为后端的
存档

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

>>> 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)

我想我可以在一个函数调用中更容易地从这两个函数中删除…

我是
klepot
的作者。您能否发布一段简化的代码片段来说明您的问题?这将有助于阐明您的问题是什么……
klepot
为缓存备份(如文件目录、文件或数据库)提供字典接口,并且您必须
pop
更新字典中的相应键
klepot
允许您同时拥有“内存”缓存和后端,您可以选择何时以及如何同步。所以,我仍然不知道你的问题是什么……但是如果你发布的代码能够精确地指出你正在尝试的,并且显示它没有按照预期工作,我打赌我可以告诉你你需要做什么。你是如何编辑这些条目的?太好了,我想它有点像内存缓存,但对术语和细节了解不够,无法指导你这么做。这就是为什么我把自己的流行音乐改成了del,因为我知道流行音乐可以把它留在记忆中。无论如何,这正是我在从我的字典中删除一个值时所缺少的。@MarioER:
del
也会起作用。您只需从两者中删除
del
>>> 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)