繁体   English   中英

使用Klepto保存和编辑Python

[英]Python Saving and Editing with Klepto

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

项目

因此,我遇到的问题与保存文件的方式有关。 我首先尝试将其腌制,因为它是一本字典,但是由于我的字典是
(名称,类别)对。

我在这里搜索了一下,发现可以尝试使用JSON进行相同的操作。 最终出现同样的错误。 最终,我找到了有效的klepto模块。 我成功保存了字典并成功加载了字典。 直到后来,我发现可以将新项目添加到文件中,但是每当我从字典中删除某些内容并保存时。 下次我加载它。 我删除的钥匙仍然在那里。

TLDR:可以向我的字典添加适当的内容并保存到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方法,但是当它无法保存更改时,我尝试了此方法。 值得注意的是,它DID从字典中删除了它们的键,值,但是保存和重新加载不会反映出该更改。

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

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

解决了:

我的问题是从字典中删除它们的方式。 万一以后有人偶然发现这里。 看看@Mike Mckerns的答案。 不得不从存档字典中删除。

基本上,您是从“内存中”缓存中删除,而不是从“文件”缓存中删除。 默认情况下, 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)

我想我可以在一个函数调用中更轻松地从两者中删除...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM