Python序列化-为什么是pickle?

Python序列化-为什么是pickle?,python,serialization,pickle,Python,Serialization,Pickle,我理解Python pickle是一种以尊重对象编程的方式“存储”Python对象的方法——不同于以txt文件或DB编写的输出 您是否有关于以下几点的更多详细信息或参考资料: 酸洗对象“存储”在哪里 为什么酸洗保存对象表示比存储在DB中更重要 我可以从一个Python shell会话检索到另一个Python shell会话中的pickle对象吗 当序列化有用时,您是否有重要的示例 使用pickle进行序列化是否意味着数据“压缩” 换句话说,我正在寻找一个关于pickle的文档-Python.

我理解Python pickle是一种以尊重对象编程的方式“存储”Python对象的方法——不同于以txt文件或DB编写的输出

您是否有关于以下几点的更多详细信息或参考资料:

  • 酸洗对象“存储”在哪里
  • 为什么酸洗保存对象表示比存储在DB中更重要
  • 我可以从一个Python shell会话检索到另一个Python shell会话中的pickle对象吗
  • 当序列化有用时,您是否有重要的示例
  • 使用pickle进行序列化是否意味着数据“压缩”

换句话说,我正在寻找一个关于pickle的文档-Python.doc解释了如何实现pickle,但似乎没有深入讨论序列化的使用和必要性。

pickle是一种将Python对象(列表、dict等)转换为字符流的方法。其思想是,此字符流包含在另一个python脚本中重建对象所需的所有信息

至于腌制信息的存储位置,通常会:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)
这将把我们的
var
dict的pickle版本存储在“filename”文件中。然后,在另一个脚本中,可以将此文件加载到变量中,然后重新创建字典:

with open('filename','rb') as f:
    var = pickle.load(f)
pickle的另一个用途是,如果您需要通过网络(可能是通过套接字或其他方式)传输此字典,则首先需要将其转换为字符流,然后可以通过套接字连接发送

此外,这里没有“压缩”可谈……它只是一种从一种表示(在RAM中)转换到另一种表示(在“文本”中)的方法


About.com对pickle有很好的介绍。

pickle对于分布式和并行计算来说是绝对必要的

假设您希望使用
多处理
(或跨群集节点)执行并行映射reduce,那么您需要确保要跨并行资源映射的函数将被pickle。如果它没有进行pickle,则无法将其发送到另一个进程、计算机等上的其他资源。另请参阅一个好的示例

为此,我使用,它可以序列化python中的几乎所有内容。Dill还可以帮助您理解代码失败时是什么导致酸洗失败


而且,是的,人们使用拾取来保存计算或会话的状态,或者其他。如果愿意,还可以扩展pickle的Pickler和UnPickler,使用
bz2
gzip
进行压缩。

这是一种序列化。使用cPickle它比泡菜快得多

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)

我发现它对于大型复杂的自定义类特别有用。在我想到的一个特定示例中,“收集”信息(从数据库中)来创建类已经完成了一半的工作。然后,存储在类中的信息可能会在运行时被用户更改

您可以在数据库中有另一组表,然后编写另一个函数来检查存储的所有内容,并将其写入新的数据库表。然后,您需要编写另一个函数,以便能够加载通过将所有信息读回中保存的内容


或者,可以按原样pickle整个类,然后将其存储到数据库中的单个字段中。然后当你去加载它时,它会像以前一样一次加载回来。在保存和检索复杂的类时,这最终可以节省大量的时间和代码。

保存状态以便以后恢复,或者将对象共享/复制到其他python运行时,这可能是我的猜测。Wikipedia关于序列化的文章回答了你的许多问题:你是在问为什么我需要Pickle来进行序列化吗python或者更确切地说,序列化的目的到底是什么?最好提及pickle的安全问题。示例可以在中找到,也可以在许多SO问题中找到,例如。通常情况下,
将open('filename')作为f:…
也可以使用
将open(filename,'wb')作为f:…
,否则您将无法写入该文件。谢谢!!这篇关于Python持久性管理的文章很好,一般来说,使用
pickle
通过网络传输字典不是一个好主意(json在这里可能更好)。虽然在极少数情况下,它可能有用,例如,
多处理
模块。@Tim Pietzcker:
协议=0
(Python2.x上的默认值)可用于以文本模式打开的文件。