zoukankan      html  css  js  c++  java
  • Python ,pickle

    @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,则不会多次去序列化对象。

  • 相关阅读:
    [转]Windows管道系统
    [转]TCP连接的状态与关闭方式,及其对Server与Client的影响
    CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);
    [转]VC++ 通过进程名或进程ID获取进程句柄
    [装]解决sqlite3插入数据很慢的问题
    SublimeText3搭建go语言开发环境(windows)
    [转]完成端口(CompletionPort)详解 手把手教你玩转网络编程系列之三
    go语言疑问
    css中marginleft与left的区别
    jsp分页显示的代码与详细步骤
  • 原文地址:https://www.cnblogs.com/liunnis/p/4694815.html
Copyright © 2011-2022 走看看