Python pickle模組用法執行個體分析
本文執行個體講述了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:Python27libpickle.py", line 1378, in load
return Unpickler(file).load()
File "C:Python27libpickle.py", line 858, in load
dispatch[key](self)
File "C:Python27libpickle.py", line 1069, in load_inst
klass = self.find_class(module, name)
File "C:Python27libpickle.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程式設計有所協助。