Python pickle模块用法实例分析

722次阅读  |  发布于5年以前

本文实例讲述了Python pickle模块用法。分享给大家供大家参考。具体分析如下:

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

pickle.dump(obj, file[, protocol])

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

pickle.load(file)

反序列化对象。将文件中的数据解析为一个Python对象。

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

比如下面的例子


    import pickle
    class Person:
      def __init__(self,n,a):
        self.name=n
        self.age=a
      def show(self):
        print self.name+"_"+str(self.age)
    aa = Person("JGood", 2)
    aa.show()
    f=open('d:\\p.txt','w')
    pickle.dump(aa,f,0)
    f.close()
    #del Person
    f=open('d:\\p.txt','r')
    bb=pickle.load(f)
    f.close()
    bb.show()

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


    >>> 
    JGood_2

    Traceback (most recent call last):
     File "C:/py/test.py", line 15, in <module>
      bb=pickle.load(f)
     File "C:\Python27\lib\pickle.py", line 1378, in load
      return Unpickler(file).load()
     File "C:\Python27\lib\pickle.py", line 858, in load
      dispatch[key](self)
     File "C:\Python27\lib\pickle.py", line 1069, in load_inst
      klass = self.find_class(module, name)
     File "C:\Python27\lib\pickle.py", line 1126, in find_class
      klass = getattr(mod, name)
    AttributeError: 'module' object has no attribute 'Person'

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

clear_memo()

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

看下面的例子:


    import StringIO
    import pickle
    class Person:
      def __init__(self,n,a):
        self.name=n
        self.age=a
      def show(self):
        print self.name+"_"+str(self.age)
    aa = Person("JGood", 2)
    aa.show()
    fle = StringIO.StringIO()
    pick = pickle.Pickler(fle)
    pick.dump(aa)
    val1=fle.getvalue()
    print len(val1)
    pick.clear_memo()
    pick.dump(aa)
    val2=fle.getvalue()
    print len(val2)
    fle.close()

上面的代码运行如下:


    >>> 
    JGood_2
    66
    132
    >>> 

此时再注释掉pick.clear_memo()后,运行结果如下:


    >>> 
    JGood_2
    66
    70
    >>> 

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

希望本文所述对大家的Python程序设计有所帮助。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8