對象存在於程序運行時的內存中,當程序再也不運行時或斷電關機時,這些對象便再也不存在。我如今想把對象保存下來,方便之後使用,這就是持久化技術。
利用 python標準庫中的的pickle
模塊能夠將對象轉換爲一種能夠傳輸或存儲的格式。python
若是但願透明地存儲 python 對象,而不丟失其身份和類型等信息,則須要某種形式的對象序列化:它是一個將任意複雜的對象轉成對象的文本或二進制表示的過程。函數
pickle模塊中有兩個主要函數,它們是dump()和load()。性能
該方法的做用是實現python 對象的序列化,將 obj 保存到 file 中。
具體語法以下:優化
pickle.dump(obj, file[, protocol])
obj:要持久化保存的對象;
file: 將對象序列化後保存到的類文件對象;
它必須有一個能夠接受單字符串做爲入參的write() 方法。這個對象能夠是一個以寫模式打開的文件對象或者一個 StringIO 對象,或者其餘任意知足條件的接口;
protocol: 可選的參數,默認爲 0。0表示所序列化的對象使用可打印的ASCII碼錶示;1或True 表示使用老式的二進制協議;2表示使用python2.3版本引入的新二進制協議,比之前的高效;負值表示將使用可用的最高協議版本。
若是 protocol>=1
,那麼文件對象須要以二進制形式打開。code
具體語法爲:對象
pickle.dumps(obj[, protocol])
返回一個字符串,而不是存入文件中。接口
該方法用於反序列化,即將序列化的對象從新恢復成python對象。
具體語法以下:內存
pickle.load(file)
這個 file 必須是一個擁有一個能接收單整數爲參數的 read() 方法以及一個不接收任何參數的 readline() 方法,而且這兩個方法的返回值都應該是字符串。這能夠是一個打開爲讀的文件對象、StringIO 對象或其餘任何知足條件的對象。字符串
pickle.loads(string)
從字符串中恢復對象。string
class pickle.Pickler(file[, protocol])
可使用該對象調用dunmp 和 load 等方法。
對於相同的對象,若是不使用clear_memo()方法,那麼python只會pickle一次
cPickle 是 pickle的優化版, cPickle是 C 編寫的所以它能夠比pickle快 1000倍。可是它不支持使用子類化的Pickler()和Unpickler()類,由於在cPickle中,這些都是否是類的功能。大多數應用程序不須要此功能,並能夠受益於cPickle的改進性能。除此以外,這兩個模塊的接口是幾乎徹底相同。
In [2]: try: ...: import cPickle as pickle ...: except: ...: import pickle ...: In [3]: info = [1, 2, 3, 'hello'] In [4]: data1 = pickle.dumps(info) In [5]: print data1 (lp1 I1 aI2 aI3 aS'hello' p2 a. In [6]: data2 = pickle.loads(data1) In [7]: print data2 [1, 2, 3, 'hello'] In [8]: type(data1) Out[8]: str