標籤:
@Python pickle模組學習
pickle提供了一個簡單的持久化功能。可以將對象以檔案的形式存放在磁碟上。
------------------------------------------
pickle.dump(obj, file[, protocol])
序列化對象,並將結果資料流寫入到檔案對象中。參數protocol是序列化模式,預設值為0,表示以文本的形式序列化。protocol的值還可以是1或2,表示以二進位的形式序列化。
------------------------------------------
pickle.load(file)
還原序列化對象。將檔案中的資料解析為一個Python對象。
其中要注意的是,在load(file)的時候,要讓python能夠找到類的定義,否則會報錯:
比如下面的例子
[python] view plaincopy
- 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的話,那麼會報錯如下:
意思就是當前模組找不到類的定義了。
--------------------------------------------------
clear_memo()
清空pickler的“備忘”。使用Pickler執行個體在序列化對象的時候,它會“記住”已經被序列化的對象引用,所以對同一對象多次調用dump(obj),pickler不會“傻傻”的去多次序列化。
看下面的例子:
[python] view plaincopy
- 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()
上面的代碼運行如下:
如果不注釋掉,則運行結果是第一個。如果注釋掉,那麼運行結果是第二個。
主要是因為,python的pickle如果不clear_memo,則不會多次去序列化對象。
Python ,pickle