Python 使用 Klepto 保存和编辑
Python Saving and Editing with Klepto
好的,我的问题很具体,我提前道歉。我是一名新程序员,并尝试从头开始自己开发。这是相对成功的,只有我有最后一个问题,我可以看到。您可以在此处完整查看我的代码。
所以我遇到的问题与我保存文件的方式有关。我首先尝试腌制它,因为它是一本字典,但我一直收到错误,因为我的字典是
(姓名, 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 的回答。不得不从存档字典中删除。
基本上,您是从 "in-memory" 缓存中删除,而不是从 "file" 缓存中删除。默认情况下,klepto
存档为您提供 "in-memory" 缓存,您可以直接通过 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)
我想我可以更轻松地在单个函数调用中从两者中删除...
好的,我的问题很具体,我提前道歉。我是一名新程序员,并尝试从头开始自己开发。这是相对成功的,只有我有最后一个问题,我可以看到。您可以在此处完整查看我的代码。
所以我遇到的问题与我保存文件的方式有关。我首先尝试腌制它,因为它是一本字典,但我一直收到错误,因为我的字典是
(姓名, 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 的回答。不得不从存档字典中删除。
基本上,您是从 "in-memory" 缓存中删除,而不是从 "file" 缓存中删除。默认情况下,klepto
存档为您提供 "in-memory" 缓存,您可以直接通过 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)
我想我可以更轻松地在单个函数调用中从两者中删除...