Spe*_*cer 56 python pickle python-2.7
我最近得到了一个分配,我需要将一个字典(每个键引用一个列表)放入酸洗形式.唯一的问题是我不知道什么是腌制形式.任何人都可以指出我在一些好资源的正确方向上帮助我学习这个概念吗?谢谢!
Sri*_*aju 89
pickle模块实现了一个基本但强大的算法,用于序列化和反序列化Python对象结构.
酸洗-是过程,由此一个Python对象分层结构被转换成字节流,并取储存-是逆操作,由此一个字节流被转换回的对象分层结构.
酸洗(和去除)也可称为序列化,编组或扁平化.
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()
Run Code Online (Sandbox Code Playgroud)
从腌制文件中读取 -
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()
Run Code Online (Sandbox Code Playgroud)
来源 - https://docs.python.org/2/library/pickle.html
Mik*_*rns 22
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."
Run Code Online (Sandbox Code Playgroud)
你在这里看到的是pickle不保存类的源代码,但确实存储了对类定义的引用.基本上,你几乎可以读取采摘串...它说(大致翻译)"呼叫copy_reg的重构这里的参数是通过定义的类__main__.Foo,然后做其他的东西." 其他的东西是实例的保存状态.如果你看得更深,可以提取"string x"设置为"整数2"(粗略:) S'x'\np6\nI2.这实际上是字典条目的腌制字符串的剪切部分...... dict存在f.__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.'
Run Code Online (Sandbox Code Playgroud)
同样,它仍然是酸洗语言的方言,你可以看到协议0字符串说"获取一个列表,包括I1,I2,I3",而协议2更难读,但同样的说法.第一位\x80\x02表示它是协议2 - 然后你]说它是一个列表,然后再次你可以看到那里的整数1,2,3.再次,检查pickle的源代码,以查看酸洗语言的确切映射.
要将酸洗反转为字符串,请使用加载/加载.
>>> p = pickle.dumps([1,2,3])
>>> pickle.loads(p)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
Tom*_*ych 11
Pickling只是序列化:将数据放入可以存储在文件中并稍后检索的表单中.以下是该pickle模块的文档:
http://docs.python.org/release/2.7/library/pickle.html
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83421 次 |
| 最近记录: |