Python標準庫分享之儲存物件 (pickle包,cPickle包)

chatGPT發表於2023-10-08

在之前對Python物件的介紹中 (物件導向的基本概念,物件導向的進一步擴充),我提到過Python“一切皆物件”的哲學,在


Python中,無論是變數還是函式,都是一個物件。當Python執行時,物件儲存在記憶體中,隨時等待系統的呼叫。然而,記憶體


裡的資料會隨著計算機關機和消失,如何將物件儲存到檔案,並儲存在硬碟上呢?


計算機的記憶體中儲存的是二進位制的序列 (當然,在Linux眼中,是文字流)。我們可以直接將某個物件所對應位置的資料抓取


下來,轉換成文字流 (這個過程叫做serialize),然後將文字流存入到檔案中。由於Python在建立物件時,要參考物件的類


定義,所以當我們從文字中讀取物件時,必須在手邊要有該物件的類定義,才能懂得如何去重建這一物件。從檔案讀取時,


對於Python的內建(built-in)物件 (比如說整數、詞典、表等等),由於其類定義已經載入記憶體,所以不需要我們再在程式中


定義類。但對於使用者自行定義的物件,就必須要先定義類,然後才能從檔案中載入物件 (比如物件導向的基本概念中的物件


那個summer)。


 


pickle包

對於上述過程,最常用的工具是Python中的pickle包。


1) 將記憶體中的物件轉換成為文字流:

import pickle
# define class
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'
summer       = Bird()                 # construct an object
picklestring = pickle.dumps(summer)   # serialize object

使用pickle.dumps()方法可以將物件summer轉換成了字串 picklestring(也就是文字流)。隨後我們可以用普通文字的儲存


方法來將該字串儲存在檔案(文字檔案的輸入輸出)。


當然,我們也可以使用pickle.dump()的方法,將上面兩部合二為一:

import pickle
# define class
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'
summer       = Bird()                        # construct an object
fn           = 'a.pkl'
with open(fn, 'w') as f:                     # open file with write-mode
    picklestring = pickle.dump(summer, f)   # serialize and save object

物件summer儲存在檔案a.pkl


2) 重建物件


首先,我們要從文字中讀出文字,儲存到字串 (文字檔案的輸入輸出)。然後使用pickle.loads(str)的方法,將字串轉


換成為物件。要記得,此時我們的程式中必須已經有了該物件的類定義。


此外,我們也可以使用pickle.load()的方法,將上面步驟合併:

import pickle
# define the class before unpickle
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'
fn     = 'a.pkl'
with open(fn, 'r') as f:
    summer = pickle.load(f)   # read file and build object

cPickle包

cPickle包的功能和用法與pickle包幾乎完全相同 (其存在差別的地方實際上很少用到),不同在於cPickle是基於c語言編寫


的,速度是pickle包的1000倍。對於上面的例子,如果想使用cPickle包,我們都可以將import語句改為:

import cPickle as pickle

就不需要再做任何改動了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026630/viewspace-2987400/,如需轉載,請註明出處,否則將追究法律責任。

相關文章