【问题标题】:Python Saving and Editing with Klepto使用 Klepto 进行 Python 保存和编辑
【发布时间】:2015-03-26 03:46:35
【问题描述】:

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

Project

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

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

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

无论如何,我对我的问题在于我保存文件的方式或加载它的方式或两者兼而有之感到困惑?任何帮助将不胜感激。

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

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

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

编辑2:

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

这就是我移除钥匙的方式。最初我使用的是 pop 方法,但是当它不保存更改时,我尝试了这个。请注意,它确实从字典中删除了它们的键、值,但保存和重新加载不会反映这种变化。

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

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

已解决编辑:

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

【问题讨论】:

  • 我是klepto 的作者。您可以发布一个简化的 sn-p 代码来演示您的问题吗?这将有助于阐明您的问题/问题/疑问是什么......
  • klepto 为缓存支持(如文件目录、文件或数据库)提供字典接口——您必须 popupdate 适当的键从字典。 klepto 允许您同时拥有“内存中”缓存和一个您可以选择何时以及如何同步的后端。所以,我仍然看不出你的问题是什么......但是如果你发布的代码指出你正在尝试并显示它没有按预期工作,我敢打赌我可以告诉你你需要做什么。你是如何编辑条目的?

标签: python dictionary pickle klepto


【解决方案1】:

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

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

【讨论】:

  • 完美 我认为它类似于内存缓存中的内容,但对术语和细节的了解不足以引导您完成此操作。这就是为什么我将自己的 pop 更改为 del,因为我知道 pop 可以将它留在内存中。无论如何,这正是我从字典中删除值所缺少的。
  • @MarioER: del 也可以。你只需要从两者中del
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2015-08-02
  • 2022-06-11
  • 1970-01-01
  • 2022-07-03
相关资源
最近更新 更多