本文实例讲述了Python pickle模块用法。分享给大家供大家参考。具体分析如下:
pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。
其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:
比如下面的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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的话,那么会报错如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>> 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不会“傻傻”的去多次序列化。
看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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() |
上面的代码运行如下:
1
2
3
4
5
|
>>> JGood_2 66 132 >>> |
此时再注释掉pick.clear_memo()后,运行结果如下:
1
2
3
4
5
|
>>> JGood_2 66 70 >>> |
主要是因为,python的pickle如果不clear_memo,则不会多次去序列化对象。
希望本文所述对大家的Python程序设计有所帮助。