it-swarm.cn

理解Python中的酸洗

我最近得到了一个分配,我需要将一个字典(其中每个键引用一个列表)放入酸洗形式。唯一的问题是我不知道什么是腌制形式。任何人都可以指出我在一些好资源的正确方向上帮助我学习这个概念吗?谢谢!

49
Spencer

虽然其他人已经指出了pickle模块上的Python文档,这是一个很好的资源,你也可以看看Mark Pilgrim的 第13章:序列化Python对象Dive Into Python 3

25
Matthew Rankin

Pickle模块实现了一个基本但强大的算法,用于序列化和反序列化Python对象结构。

Pickling - 是将Python对象层次结构转换为字节流的过程,并且 Unpickling - 是反向操作,从而将字节流转换回对象层次结构。

酸洗(和去除)也可称为 序列化 编组 ,或 展平

import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

从腌制文件中读取 -

import pprint, pickle

pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

来源 - https://docs.python.org/2/library/pickle.html

79
Srikar Appalaraju

Pickling是一种迷你语言,可用于将python对象中的相关状态转换为字符串,其中此字符串唯一地表示对象。然后(un)pickling可以用来将字符串转换为活动对象,通过从创建字符串的保存状态“重建”对象。

>>> import pickle
>>> 
>>> class Foo(object):
...   y = 1
...   def __init__(self, x):
...     self.x = x
...     return
...   def bar(self, y):
...     return self.x + y
...   def baz(self, y):
...     Foo.y = y  
...     return self.bar(y)
... 
>>> f = Foo(2)
>>> f.baz(3)
5
>>> f.y
3
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nI2\nsb."

你在这里看到的是pickle不保存类的源代码,但确实存储了对类定义的引用。基本上,你几乎可以阅读所选择的字符串...它说(粗略翻译)“调用copy_reg的重构器,其中参数是由__main__.Foo定义的类,然后执行其他操作”。其他的东西是实例的保存状态。如果你看得更深,你可以提取“字符串x”设置为“整数2”(大致:S'x'\np6\nI2)。这实际上是字典条目的pickle字符串的剪切部分... dictf.__dict__,它是{'x': 2}。如果你查看pickle的源代码,它非常清楚地给出了每种类型的对象和从python到pickle字节代码的操作的转换。

另请注意,酸洗语言有不同的变体。默认为协议0,更易于人工阅读。还有协议2,如下所示(1,3和4,取决于您使用的python版本)。

>>> pickle.dumps([1,2,3])
'(lp0\nI1\naI2\naI3\na.'
>>> 
>>> pickle.dumps([1,2,3], -1)
'\x80\x02]q\x00(K\x01K\x02K\x03e.'

同样,它仍然是酸洗语言的方言,你可以看到协议0字符串说“获取一个列表,包括I1,I2,I3”,而协议2更难读,但同样的说法。第一位\x80\x02表示它是协议2 - 然后你有]表示它是一个列表,然后再次你可以看到那里的整数1,2,3。再次,检查pickle的源代码,以查看酸洗语言的确切映射。

要将酸洗反转为字符串,请使用加载/加载。

>>> p = pickle.dumps([1,2,3])
>>> pickle.loads(p)
[1, 2, 3]
21
Mike McKerns

Pickling只是序列化:将数据放入可以存储在文件中并稍后检索的表单中。以下是pickle模块上的文档:

http://docs.python.org/release/2.7/library/pickle.html

11
Tom Zych

Python中的Pickling用于序列化和反序列化Python对象,例如您的字典中的字典。我通常使用cPickle模块,因为它可以比Pickle模块快得多。

import cPickle as pickle    

def serializeObject(pythonObj):
    return pickle.dumps(pythonObj, pickle.HIGHEST_PROTOCOL)

def deSerializeObject(pickledObj):
    return pickle.loads(pickledObj)
3
Raunak

http://docs.python.org/library/pickle.html#example

import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()
3
John Riselvato

Pickle模块实现了一个基本但强大的算法,用于序列化和反序列化Python对象结构。 “Pickling”是将Python对象层次结构转换为字节流的过程,“unpickling”是反向操作,从而将字节流转换回对象层次结构。酸洗(和去除斑点)可选地称为“序列化”,“编组”或“扁平化”,然而,为了避免混淆,这里使用的术语是“酸洗”和“去除”。

Pickle模块有一个名为cPickle模块的优化表亲。顾名思义,cPickle是用C语言编写的,因此它比pickle快1000倍。但是,它不支持Pickler()和Unpickler()类的子类化,因为在cPickle中这些是函数,而不是类。大多数应用程序不需要此功能,并且可以从cPickle的改进性能中受益。除此之外,两个模块的接口几乎相同;本手册中描述了通用接口,并在必要时指出了不同之处。在下面的讨论中,我们使用术语“pickle”来共同描述pickle和cPickle模块。

保证两个模块产生的数据流可互换。

2
Naren