Python pickle模組用法執行個體分析

來源:互聯網
上載者:User

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程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.