我第一次学习对象序列化。我尝试阅读和“谷歌搜索”模块泡菜和搁置的差异,但我不确定我理解它。什么时候使用哪一个? Pickle可以将每个python对象转换为可以保存到文件中的字节流。那为什么我们需要模块搁置?泡菜不快吗?
答案 0 :(得分:79)
pickle
用于将某些对象(或对象)序列化为文件中的单个字节流。
shelve
构建在pickle
之上,并实现了一个序列化字典,其中对象被pickle,但与一个键(某个字符串)相关联,因此您可以加载搁置的数据文件并访问您的pickle对象通过钥匙。如果您要序列化许多对象,这可能会更方便。
以下是两者之间的用法示例。 (应该在最新版本的Python 2.7和Python 3.x中工作)。
pickle
示例import pickle
integers = [1, 2, 3, 4, 5]
with open('pickle-example.p', 'wb') as pfile:
pickle.dump(integers, pfile)
这会将integers
列表转储到名为pickle-example.p
的二进制文件。
现在尝试回读腌制的文件。
import pickle
with open('pickle-example.p', 'rb') as pfile:
integers = pickle.load(pfile)
print integers
以上内容应输出[1, 2, 3, 4, 5]
。
shelve
示例import shelve
integers = [1, 2, 3, 4, 5]
# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
shelf['ints'] = integers
注意如何通过字典式访问将对象添加到书架。
使用以下代码重新读取对象:
import shelve
# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
for key in shelf.keys():
print(repr(key), repr(shelf[key])))
输出为'ints', [1, 2, 3, 4, 5]
。
答案 1 :(得分:3)
根据pickle文档:
串行化是一种比持久性更原始的概念;尽管 pickle 读写文件对象,但是它不能处理持久对象的命名问题,也不能处理(甚至更复杂的)并发访问持久对象的问题。 pickle 模块可以将复杂的对象转换为字节流,并且可以将字节流转换为具有相同内部结构的对象。也许与这些字节流有关的最明显的事情是将它们写入文件中,但是也可以考虑通过网络发送它们或将它们存储在数据库中。 shelve 模块提供了一个简单的界面,可以使DBM样式的数据库文件中的对象腌制和释放。