Python标准库存储对象(pickle包,cPickle包)
作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!
在之前對(duì)Python對(duì)象的介紹中 (面向?qū)ο蟮幕靖拍睿嫦驅(qū)ο蟮倪M(jìn)一步拓展),我提到過(guò)Python“一切皆對(duì)象”的哲學(xué),在Python中,無(wú)論是變量還是函數(shù),都是一個(gè)對(duì)象。當(dāng)Python運(yùn)行時(shí),對(duì)象存儲(chǔ)在內(nèi)存中,隨時(shí)等待系統(tǒng)的調(diào)用。然而,內(nèi)存里的數(shù)據(jù)會(huì)隨著計(jì)算機(jī)關(guān)機(jī)和消失,如何將對(duì)象保存到文件,并儲(chǔ)存在硬盤(pán)上呢?
計(jì)算機(jī)的內(nèi)存中存儲(chǔ)的是二進(jìn)制的序列 (當(dāng)然,在Linux眼中,是文本流)。我們可以直接將某個(gè)對(duì)象所對(duì)應(yīng)位置的數(shù)據(jù)抓取下來(lái),轉(zhuǎn)換成文本流(這個(gè)過(guò)程叫做serialize),然后將文本流存入到文件中。由于Python在創(chuàng)建對(duì)象時(shí),要參考對(duì)象的類(lèi)定義,所以當(dāng)我們從文本中讀取對(duì)象時(shí),必須在手邊要有該對(duì)象的類(lèi)定義,才能懂得如何去重建這一對(duì)象。從文件讀取時(shí),對(duì)于Python的內(nèi)建(built-in)對(duì)象 (比如說(shuō)整數(shù)、詞典、表等等),由于其類(lèi)定義已經(jīng)載入內(nèi)存,所以不需要我們?cè)僭诔绦蛑卸x類(lèi)。但對(duì)于用戶(hù)自行定義的對(duì)象,就必須要先定義類(lèi),然后才能從文件中載入對(duì)象 (比如面向?qū)ο蟮幕靖拍钪械膶?duì)象那個(gè)summer)。
1. pickle包
對(duì)于上述過(guò)程,最常用的工具是Python中的pickle包。
1) 將內(nèi)存中的對(duì)象轉(zhuǎn)換成為文本流:
import pickle
# 定義類(lèi)
class Bird(object):
have_feather = True
way_of_reproduction = 'egg'
summer = Bird() # 創(chuàng)建對(duì)象
picklestring = pickle.dumps(summer) # serialize object
使用pickle.dumps()方法可以將對(duì)象summer轉(zhuǎn)換成了字符串 picklestring(也就是文本流)。隨后我們可以用普通文本的存儲(chǔ)方法來(lái)將該字符串儲(chǔ)存在文件(文本文件的輸入輸出)。
當(dāng)然,我們也可以使用pickle.dump()的方法,將上面兩部合二為一:
import pickle
# 定義類(lèi) class Bird(object): have_feather = True way_of_reproduction = 'egg' summer = Bird() # 創(chuàng)建對(duì)象 fn = 'a.pkl' picklestring = pickle.dump(summer, fn) # serialize and save object
對(duì)象summer存儲(chǔ)在文件a.pkl
2)重建對(duì)象
首先,我們要從文本中讀出文本,存儲(chǔ)到字符串 (文本文件的輸入輸出)。然后使用pickle.loads(str)的方法,將字符串轉(zhuǎn)換成為對(duì)象。要記得,此時(shí)我們的程序中必須已經(jīng)有了該對(duì)象的類(lèi)定義。
此外,我們也可以使用pickle.load()的方法,將上面步驟合并:
import pickle
# 在讀取之前必須定義類(lèi),這個(gè)類(lèi)與我們要讀取的對(duì)象一致。
class Bird(object):
have_feather = True
way_of_reproduction = 'egg'
fn = 'a.pkl'
summer = pickle.load(fn) # read file and build object
2. cPickle包
cPickle包的功能和用法與pickle包幾乎完全相同 (其存在差別的地方實(shí)際上很少用到),不同在于cPickle是基于c語(yǔ)言編寫(xiě)的,速度是pickle包的1000倍。對(duì)于上面的例子,如果想使用cPickle包,我們都可以將import語(yǔ)句改為:
import cPickle as pickle
就不需要再做任何改動(dòng)了。
總結(jié):
對(duì)象 -> 文本 -> 文件
pickle.dump(), pickle.load(), cPickle
作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!
標(biāo)簽:Python
作者:Leo_wl
出處:http://www.cnblogs.com/Leo_wl/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
版權(quán)信息
總結(jié)
以上是生活随笔為你收集整理的Python标准库存储对象(pickle包,cPickle包)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux kdb 内核调试器
- 下一篇: jeesit 部署404