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