理解Python中的酸洗

时间:2011-09-21 14:55:15

标签: python pickle python-2.7

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

9 个答案:

答案 0 :(得分:79)

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

答案 1 :(得分:25)

虽然其他人已经指出了pickle模块上的Python文档,这是一个很好的资源,你也可以查看Mark Pilgrim的 Dive Into Python 3 Chapter 13: Serializing Python Objects

答案 2 :(得分:21)

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

>>> 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]

答案 3 :(得分:11)

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

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

答案 4 :(得分:3)

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()

答案 5 :(得分:3)

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)

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:1)

Pickle>系列化>二进制流

import pickle
f = open("data.txt","wb")
dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

解开>反序列化

import pickle
f = open("data.txt","rb")
d = pickle.load(f)
print (d)
f.close()

酸洗

>>> from pickle import dump
>>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'

解酸

>>> from pickle import load
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

答案 8 :(得分:0)

酸洗允许您序列化和反序列化 Python对象结构。简而言之,Pickling是一种将python对象转换为字符流的方法,以便该字符流包含在另一个python脚本中重建该对象所需的所有信息。

进口泡菜

def pickle_data():
  data = {
            'name': 'sanjay',
            'profession': 'Software Engineer',
            'country': 'India'
    }
  filename = 'PersonalInfo'
  outfile = open(filename, 'wb')
  pickle.dump(data,outfile)
  outfile.close()
  pickle_data()