删除或编辑使用 Python pickle 保存的条目

Remove or edit entry saved with Python pickle(删除或编辑使用 Python pickle 保存的条目)
本文介绍了删除或编辑使用 Python pickle 保存的条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我基本上会执行转储和加载序列,但有时我想删除其中一个加载的条目.我怎样才能做到这一点?有没有办法删除或编辑使用 Python pickle/cpickle 保存的条目?

I basically do sequences of dump and load, but at some point I want to delete one of the loaded entries. How can I do that? Is there a way to remove, or edit entries saved with Python pickle/cpickle?

数据与pickle一起保存在二进制文件中.

The data is saved with pickle in a binary file.

推荐答案

要从二进制文件中删除腌制对象,您必须重写整个文件.pickle 模块不处理流的任意部分的修改,因此没有内置的方式来做你想做的事.

To delete a pickled object from a binary file you must rewrite the whole file. The pickle module doesn't deal with modifications at arbitrary portions of the stream, so there is no built-in way of doing what you want.

可能最简单的二进制文件替代方法是使用 shelve 模块.

Probably the simplest alternative to binary files is to use the shelve module.

这个模块为包含腌制数据的数据库提供了一个类似 dict 的接口,您可以从文档中的示例中看到:

This module provides a dict like interface to a database containing the pickled data, as you can see from the example in the documentation:

import shelve

d = shelve.open(filename) # open -- file may get suffix added by low-level
                          # library

d[key] = data   # store data at key (overwrites old data if
                # using an existing key)
data = d[key]   # retrieve a COPY of data at key (raise KeyError if no
                # such key)
del d[key]      # delete data stored at key (raises KeyError
                # if no such key)
flag = key in d        # true if the key exists
klist = list(d.keys()) # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]    # this works as expected, but...
d['xx'].append(3)      # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']      # extracts the copy
temp.append(5)      # mutates the copy
d['xx'] = temp      # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()       # close it

使用的数据库是 ndbmgdbm,具体取决于平台和可用的库.

The database used is ndbm or gdbm, depending on the platform and the libraries available.

注意:如果数据没有移动到其他平台,这会很好.如果您希望能够将数据库复制到另一台计算机,那么 shelve 将无法正常工作,因为它不能保证将使用哪个库.在这种情况下,使用显式 SQL 数据库可能是最好的选择.

Note: this works well if the data is not moved to an other platform. If you want to be able to copy the database to an other computer then shelve wont work well, since it does not provide guarantees regarding which library will be used. In this case using an explicit SQL database is probably the best option.

这篇关于删除或编辑使用 Python pickle 保存的条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to find element by part of its id name in selenium with python(如何使用python在selenium中通过其id名称的一部分查找元素)
NoSuchElementException: Message: Unable to locate element while trying to click on the button VISA through Selenium and Python(NoSuchElementException:消息:尝试通过 Selenium 和 Python 单击 VISA 按钮时无法找到元素) - IT屋-程序员软件开发技术分
Selenium not able to click on Get Data button on using Python(Selenium 在使用 Python 时无法单击“获取数据按钮)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable with Selenium and Python(selenium.common.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素不可点击
Selenium Compound class names not permitted(不允许使用硒化合物类名称)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium(selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:尝试使用 selenium 单