Python serialization - Why pickle?
我知道,python pickle是一种以尊重对象编程的方式"存储"python对象的方法,与用txt文件或db编写的输出不同。
您是否对以下几点有更多详细信息或参考资料:
- 泡菜"存储"在哪里?
- 为什么酸洗保存对象表示比存储在数据库中更重要?
- 我可以从一个python shell会话检索到另一个会话中的pickled对象吗?
- 当序列化有用时,您是否有重要的示例?
- 使用pickle进行序列化是否意味着数据"压缩"?
换句话说,我正在寻找一个关于pickle-python.doc的文档,它解释了如何实现pickle,但似乎没有深入讨论关于序列化的使用和必要性的细节。
pickle是一种将Python对象(list、dict等)转换为字符流的方法。其思想是,这个字符流包含在另一个Python脚本中重建对象所需的所有信息。
至于存储泡菜信息的位置,通常可以这样做:
1 2 3 | with open('filename', 'wb') as f: var = {1 : 'a' , 2 : 'b'} pickle.dump(var, f) |
这将把我们的
1 2 | with open('filename','rb') as f: var = pickle.load(f) |
酸洗的另一个用途是,如果您需要通过网络(可能带有套接字或其他东西)传输此字典,首先需要将其转换为字符流,然后可以通过套接字连接发送它。
此外,这里没有"压缩"可言……这只是一种从一种表示(在RAM中)转换为另一种表示(在"文本"中)的方法。
about.com在这里介绍了腌制。
酸洗对于分布式和并行计算是绝对必要的。
假设您想使用
为此,我使用dill,它可以在Python中序列化几乎所有内容。Dill还有一些很好的工具可以帮助您理解当代码失败时,什么导致酸洗失败。
是的,人们使用选择来保存计算的状态,或者你的ipython会话,或者其他什么。如果您愿意的话,您还可以扩展pickle的pickler和unpickler来压缩
我发现它对于大型和复杂的自定义类特别有用。在我正在考虑的一个特定的例子中,(从数据库)收集信息来创建类已经是一半的战斗了。然后,存储在类中的信息可能会在运行时被用户更改。
您可以在数据库中拥有另一组表,并编写另一个函数来遍历存储的所有内容并将其写入新的数据库表。然后,您需要编写另一个函数,以便能够加载通过重新读取所有信息而保存的内容。
或者,您可以按原样pickle整个类,然后将其存储到数据库中的单个字段中。然后当你把它装回去的时候,它会像以前一样,一次装回去。当保存和检索复杂的类时,这可以节省大量的时间和代码。
它是一种序列化。用玉米饼比泡菜快得多。
1 2 3 4 5 6 7 8 | import pickle ##make Pickle File with open('pickles/corups.pickle', 'wb') as handle: pickle.dump(corpus, handle) #read pickle file with open('pickles/corups.pickle', 'rb') as handle: corpus = pickle.load(handle) |