泡菜和货架有什么区别?
我正在学习对象序列化的第一次。 我尝试阅读和search模块pickle和搁置的差异,但我不知道我明白这一点。 何时使用哪一个? Pickle可以将每个python对象转换为可以保存到文件中的字节stream。 那么为什么我们需要模块搁置? 不是咸菜更快?
pickle
是将一些对象(或对象)作为一个文件中的单个字节stream进行序列化。
shelve
build立在pickle
之上,实现了一个序列化字典,在这个字典中pickle
对象,但是与一个key(一些string)相关联,所以你可以加载你搁置的数据文件并通过键访问pickled对象。 如果你要序列化许多对象,这可能会更方便。
以下是两者之间的用法示例。 (应该在最新版本的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]
。