程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Python pickle模塊用法實例分析

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程序設計有所幫助。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved