python,pickle,serialize Python標準庫05 存儲對象 (pickle包,cPickle包) 面向對象的基本概念 面向對象的進一步拓展 面向對象的基本概念 文本文件的輸入輸出

Python標準庫05 存儲對象 (pickle包,cPickle包)

 

做者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!html

謝謝reverland糾錯函數

在以前對Python對象的介紹中 (面向對象的基本概念面向對象的進一步拓展),我提到過Python「一切皆對象」的哲學,在Python中,不管是變量仍是函數,都是一個對象。當Python運行時,對象存儲在內存中,隨時等待系統的調用。然而,內存裏的數據會隨着計算機關機和消失,如何將對象保存到文件,並儲存在硬盤上呢?工具

計算機的內存中存儲的是二進制的序列 (固然,在Linux眼中,是文本流)。咱們能夠直接將某個對象所對應位置的數據抓取下來,轉換成文本流 (這個過程叫作serialize),而後將文本流存入到文件中。因爲Python在建立對象時,要參考對象的類定義,因此當咱們從文本中讀取對象時,必須在手邊要有該對象的類定義,才能懂得如何去重建這一對象。從文件讀取時,對於Python的內建(built-in)對象 (好比說整數、詞典、表等等),因爲其類定義已經載入內存,因此不須要咱們再在程序中定義類。但對於用戶自行定義的對象,就必需要先定義類,而後才能從文件中載入對象 (好比面向對象的基本概念中的對象那個summer)。post

 

1. pickle包
對於上述過程,最經常使用的工具是Python中的pickle包。ui

1) 將內存中的對象轉換成爲文本流url

複製代碼
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(也就是文本流)。隨後咱們能夠用普通文本的存儲方法來將該字符串儲存在文件(文本文件的輸入輸出)。spa

 

固然,咱們也可使用pickle.dump()的方法,將上面兩部合二爲一:code

複製代碼
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.pklhtm

 

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
複製代碼

 

 

2. cPickle包

cPickle包的功能和用法與pickle包幾乎徹底相同 (其存在差異的地方實際上不多用到),不一樣在於cPickle是基於c語言編寫的,速度是pickle包的1000倍。對於上面的例子,若是想使用cPickle包,咱們均可以將import語句改成:

import cPickle as pickle

就不須要再作任何改動了。

 

總結:

對象 -> 文本 -> 文件

pickle.dump(), pickle.load(), cPickle

相關文章
相關標籤/搜索