码迷,mamicode.com
首页 > 编程语言 > 详细

Python ,pickle

时间:2015-08-01 23:29:55      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

@Python pickle模块学习

 

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。

------------------------------------------

pickle.dump(obj, file[, protocol])
  序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。

------------------------------------------
pickle.load(file)
  反序列化对象。将文件中的数据解析为一个Python对象。

其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:

比如下面的例子

  1. import pickle  
  2. class Person:  
  3.     def __init__(self,n,a):  
  4.         self.name=n  
  5.         self.age=a  
  6.     def show(self):  
  7.         print self.name+"_"+str(self.age)  
  8. aa = Person("JGood", 2)  
  9. aa.show()  
  10. f=open(‘d:\\p.txt‘,‘w‘)  
  11. pickle.dump(aa,f,0)  
  12. f.close()  
  13. #del Person  
  14. f=open(‘d:\\p.txt‘,‘r‘)  
  15. bb=pickle.load(f)  
  16. f.close()  
  17. bb.show()  

如果不注释掉del Person的话,那么会报错如下:

技术分享

意思就是当前模块找不到类的定义了。

--------------------------------------------------

clear_memo()
  清空pickler的“备忘”。使用Pickler实例在序列化对象的时候,它会“记住”已经被序列化的对象引用,所以对同一对象多次调用dump(obj),pickler不会“傻傻”的去多次序列化。
看下面的例子:

  1. import StringIO  
  2. import pickle  
  3. class Person:  
  4.     def __init__(self,n,a):  
  5.         self.name=n  
  6.         self.age=a  
  7.     def show(self):  
  8.         print self.name+"_"+str(self.age)  
  9. aa = Person("JGood", 2)  
  10. aa.show()  
  11. fle = StringIO.StringIO()   
  12. pick = pickle.Pickler(fle)  
  13. pick.dump(aa)  
  14. val1=fle.getvalue()  
  15. print len(val1)  
  16. pick.clear_memo()  
  17. pick.dump(aa)  
  18. val2=fle.getvalue()  
  19. print len(val2)  
  20. fle.close()  

上面的代码运行如下:

技术分享

如果不注释掉,则运行结果是第一个。如果注释掉,那么运行结果是第二个。

主要是因为,python的pickle如果不clear_memo,则不会多次去序列化对象。

Python ,pickle

标签:

原文地址:http://www.cnblogs.com/liunnis/p/4694815.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!