import marshal,pickle
list = [1]
list.append(list)
print marshal.dumps(list) #出错, 无限制的递归序列化
print pickle.dumps(list) #no problem
pickle的序列化规则
Python规范(Python-specific)提供了pickle的序列化规则。这就不必担心不同版本的Python之间序列化兼容性问题。默认情况下,pickle的序列化是基于文本的,我们可以直接用文本编辑器查看序列化的文本。我们也可以序列成二进制格式的数据,这样的结果体积会更小。更详细的内容,可以参考Python手册pickle模块。
下面就开始使用pickle吧~
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。下面通过一个简单的例子来演示上面两个方法的使用:
#!/usr/bin/python
# Filename: pickling.py
import cPickle as p
#import pickle as p
shoplistfile = 'shoplist.data'
# the name of the file where we will store the object
shoplist = ['apple', 'mango', 'carrot']
# Write to the file
f = file(shoplistfile, 'w')
p.dump(shoplist, f) # dump the object to a file
f.close()
del shoplist # remove the shoplist
# Read back from the storage
f = file(shoplistfile)
storedlist = p.load(f)
print storedlist
还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍)。你可以使用它们中的任一个,而我们在这里将使用cPickle模块。记住,我们把这两个模块都简称为pickle模块。
后记
try:
import cPickle as pickle
except ImportError:
import pickle
unpickler=pickle.Unpickler
file = StringIO(val)
_up = unpickler(file)
val = _up.loads()
可以简化成:
import cPickle
rp = cPickle.loads(val)
http://sebug.net/paper/python/ch12s02.html
http://blog.csdn.net/jgood/article/details/4564014
http://www.ibm.com/developerworks/cn/linux/l-pypers/index.html
分享到:
2012-06-18 12:41
浏览 19550
评论