Python標準庫分享之儲存物件 (pickle包,cPickle包)
在之前對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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python 快速教程(標準庫05):儲存物件 (pickle包,cPickle包)Python物件
- Python標準庫分享之檔案管理 (部分os包,shutil包)Python
- pickle和cPickle:Python物件的序列化(下)Python物件
- pickle和cPickle:Python物件的序列化(上)Python物件
- python核心模組之pickle和cPickle講解Python
- Python標準庫04 檔案管理 (部分os包,shutil包)Python
- 「Golang成長之路」標準庫之os包Golang
- 「Golang成長之路」標準庫之time包Golang
- Python模組學習 :pickle, cPickle 物件序列化/反序列化Python物件
- Python標準庫12 數學與隨機數 (math包,random包)Python隨機random
- Python 快速教程(標準庫04):檔案管理 (部分os包,shutil包)Python
- Python 快速教程(標準庫07):訊號 (signal包,部分os包)Python
- Python標準庫10 多程式初步 (multiprocessing包)Python
- Python標準庫11 多程式探索 (multiprocessing包)Python
- Python 快速教程(標準庫06):子程式 (subprocess包)Python
- Go標準包-http包serverGoHTTPServer
- 標準庫 fmt 包的基本使用
- Python 快速教程(標準庫12):數學與隨機數 (math包,random包)Python隨機random
- python常用標準庫(壓縮包模組zipfile和tarfile)Python
- Python深入分享之閉包Python
- golang標準庫的分析os包(6)Golang
- Go標準庫flag包的“小陷阱”Go
- Golang中的unsafe標準庫包Golang
- Python 快速教程(標準庫03):路徑與檔案 (os.path包, glob包)Python
- Python 快速教程(標準庫10):多程式初步 (multiprocessing包)Python
- Python 快速教程(標準庫09):當前程式資訊 (os包)Python
- Python 快速教程(標準庫01):正規表示式 (re包)Python
- 標準庫 http 包的簡單實用HTTP
- go標準庫-log包原始碼學習Go原始碼
- Python閉包和儲存自由變數Python變數
- Go標準包——net/rpc包的使用GoRPC
- Go標準包—http clientGoHTTPclient
- Python3內建模組之Pickle和cPickle資料持久化方法小結Python持久化
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- 機器學習之儲存與載入.pickle模型檔案機器學習模型
- Python分享之數學與隨機數 (math包,random包)Python隨機random
- Python 快速教程(標準庫02):時間與日期 (time, datetime包)Python
- Go 的 golang.org/x/ 系列包和標準庫包有什麼區別?Golang