1. 程式人生 > >Python pickle模組學習

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的話,那麼會報錯如下:

意思就是當前模組找不到類的定義了。

--------------------------------------------------

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,則不會多次去序列化物件。