删除或编辑使用 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
使用的数据库是 ndbm
或 gdbm
,具体取决于平台和可用的库.
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.
相关文章