Python序列化 – 为什么咸菜?

我明白,Python酸洗是一种“存储”Python对象的方式,它尊重对象编程 – 与用txt文件或DB编写的输出不同。

你有更多的细节或参考以下几点:

  • 腌渍物品在哪里“储存”?
  • 为什么酸洗保存对象表示比在DB中存储更多?
  • 我可以从一个Python shell会话检索pickled对象到另一个吗?
  • 序列化有用的时候有没有重要的例子?
  • 序列化与泡菜暗示数据“压缩”?

换句话说,我正在寻找一个关于酸洗的文档–Python.doc解释了如何实现pickle,但似乎没有详细介绍序列化的使用和必要性。

酸洗是一种将python对象(列表,字典等)转换为字符stream的方法。 这个想法是这个字符stream包含了在另一个python脚本中重build对象所需的所有信息。

至于腌制信息的存储位置,通常可以这样做:

with open('filename', 'wb') as f: var = {1 : 'a' , 2 : 'b'} pickle.dump(var, f) 

这将存储在我们的var字典在'文件名'文件的腌制版本。 然后,在另一个脚本中,你可以从这个文件加载到一个variables,字典将被重新创build:

 with open('filename','rb') as f: var = pickle.load(f) 

酸洗的另一个用途是如果你需要通过networking传输这个字典(也许用套接字或者什么的)。你首先需要把它转换成字符stream,然后你可以通过套接字连接发送它。

另外,在这里没有“压缩”的说法,它只是将一种表示(在RAM中)转换为另一种(在“文本”中)的一种方式。

About.com 在这里有一个不错的酸洗介绍。

酸洗对于分布式和并行计算是绝对必要的。

假设你想做一个multiprocessing的并行map-reduce(或者跨pygin的集群节点),那么你需要确保你想在并行资源上映射的函数会被pickle。 如果不腌泡,则不能将其发送到其他进程,计算机等上的其他资源。另请参见此处的示例。

为了做到这一点,我使用莳萝 ,它可以序列化几乎任何东西在Python中。 莳萝也有一些很好的工具 ,可以帮助你理解什么是你的代码失败时导致你的酸洗失败。

而且,是的,人们使用picking来保存计算的状态,或者你的ipython会话,或者其他什么。 你也可以扩展Pickle的Pickler和UnPickler,如果你愿意,可以用bz2或者gzip来压缩。