Python pickle模組學習
阿新 • • 發佈:2019-02-09
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的話,那麼會報錯如下:
意思就是當前模組找不到類的定義了。
--------------------------------------------------
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()
上面的程式碼執行如下:
如果不註釋掉,則執行結果是第一個。如果註釋掉,那麼執行結果是第二個。
主要是因為,python的pickle如果不clear_memo,則不會多次去序列化物件。