python 序列化操作

程序運行時,所有的變量都是在內存中的,例如在程序中申請一個 dict 對象,裏面存儲着爬取的頁面的鏈接、頁面的標題、頁面的摘要等信息:

d = dict(url = 'index.html', title = '首頁', content = '首頁')

    在程序運行的過程中爬取的頁面的鏈接會不斷變化,比如把 url 改成了 secone.html,但是程序一結束或者意外中斷,程序中的內存變量都會被操作系統進行回收。如果沒有把修改過的 url 存儲起來,下次運行程序的時候,url被初始化爲 index.html,又是從首頁開始。所以把內存中的變量變成可存儲或可傳輸的過程,就是序列化。

    將內存中的變量序列化之後,可以把序列化後的內存寫入磁盤,或者通過網絡傳輸到別的機器上,實現程序狀態的保存和共享。反過來,把變量內容從序列化的對象重新讀取到內存,稱爲反序列化。

    在 python 中提供了兩個模塊:cPickle 和 pickle 來實現序列化,前者由於是C語音寫的,所以效率更高,但是兩個模塊的功能是一樣的。所以我們在使用的過程中一般寫成下面的樣式:

    PS:python3中cPickle模塊已經更名爲_pickle。

In [60]: try: 
    ...:     import cPickle as pickles 
    ...: except ImportError: 
    ...:     import pickles

    pickle 實現序列化主要使用的是 dumps 方法或 dump 方法。dumps 方法可以將任意對象序列化成一個 str,然後可以將這個 str 寫入文件進行保存。示例:

In [1]: import _pickle as cPickle                                                                                                                                          

In [2]: d = dict(url = 'index.html', title = '首頁', content = '首頁')                                                                                                     

In [3]: import _pickle as pickle                                                                                                                                           

In [4]: d = dict(url = 'index.html', title = '首頁', content = '首頁')                                                                                                     

In [5]:  pickle.dumps(d)                                                                                                                                                    
Out[5]: b'\x80\x03}q\x00(X\x07\x00\x00\x00contentq\x01X\x06\x00\x00\x00\xe9\xa6\x96\xe9\xa1\xb5q\x02X\x03\x00\x00\x00urlq\x03X\n\x00\x00\x00index.htmlq\x04X\x05\x00\x00\x00titleq\x05h\x02u.'

In [6]: 

    使用dump方法,可以將序列化後的對象直接寫入文件中:

In [7]: import _pickle as pickle                                                                                                                                           

In [8]: d = dict(url = 'index.html', title = '首頁', content = '首頁')                                                                                                     

In [9]: f = open('ceshi.txt', 'wb')                                                                                                                                        

In [10]: pickle.dump(d, f)                                                                                                                                                 

In [11]: f.close()                                                                                                                                                         

In [12]: cat ceshi.txt                                                                                                                                                     
}q(XcontentqX首頁qXurlqX
index.htmlqXtitleqhu.
In [13]: XshellXshell 

    pickle 實現反序列化使用的是 loads 方法或 load 方法。把序列化後的文件從磁盤上讀取爲一個 str, 然後使用loads方法將這個str反序列化爲對象,或者直接使用load方法將文件直接反序列化爲對象,示例:

In [13]: f = open('ceshi.txt', 'rb')                                                                                                                                       

In [14]: d = pickle.load(f)                                                                                                                                                

In [15]: f.close()                                                                                                                                                         

In [16]: d                                                                                                                                                                 
Out[16]: {'content': '首頁', 'title': '首頁', 'url': 'index.html'}

In [17]:  

    通過反序列化,存儲爲文件的dict對象,又重新恢復出來,但是這個變量和原變量沒有什麼關係,只是內容一樣。

    以上就是序列化操作的整個過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章