python-持久性管理(pickle)

1.什麼是持久性:


持久性的基本思想很簡單。假定有一個 Python 程序,它可能是一個管理日常待辦事項的程序,您希望在多次執行這個程序之間可以保存應用程序對象(待辦事項)。換句話說,您希望將對象存儲在磁盤上,便於以後檢索。這就是持久性。要達到這個目的,有幾種方法,每一種方法都有其優缺點。


例如,可以將對象數據存儲在某種格式的文本文件中,譬如 CSV 文件。或者可以用關係數據庫,譬如 Gadfly、MySQL、PostgreSQL 或者 DB2。這些文件格式和數據庫都非常優秀,對於所有這些存儲機制,Python 都有健壯的接口。


這些存儲機制都有一個共同點:存儲的數據是獨立於對這些數據進行操作的對象和程序。這樣做的好處是,數據可以作爲共享的資源,供其它應用程序使用。缺點 是,用這種方式,可以允許其它程序訪問對象的數據,這違背了面向對象的封裝性原則 — 即對象的數據只能通過這個對象自身的公共(public)接口來訪問。


2.對象持久性-對象序列化/反序列化


有時您 可以在讀寫的時候,手動進行與字符串的轉換(例如,用str和eval調用),但只能做到這樣。對任意複雜的Python對象,如類實例和嵌套的數據結 構,您需要更多的東西。例如,類實例對象以後無法從其標準字符串表達(string representation)重建。自定義的到字符串的轉換容易出錯,並且不通用。

Python 系統的標準部件,pickle模塊,提供了所需的轉換步驟。它可以將幾乎任意的Python內存對象,轉換爲單一線性的字符串格式,使之適於無格式文件存 儲,或在可靠來源之間跨越網絡套接口傳輸等等,並可反向轉換。這種從對象到字符串的轉換通常被稱爲序列化(serialization):將內存中的任意 數據結構映射爲串行字符串形式。 


對象的字符串表達由於其線性的格式,有時也被稱爲字節流。它包含了原始內存中對象的所有內容和引用結構。當對象後來從其字節串重建時,內存中新建的對象與原對象具有相同的結構和值,但位於不同的內存地址。該重建對象實際上是原對象的複製。


3.pickle

(1)dump-序列化,load--反序列化

import pickle
f = open('temp', 'w')
x = ['Hello', ('pickle', 'world')]           # list with nested tuple
pickle.dump(x, f)
f.close( )                                   # close to flush changes

f = open('temp', 'r')
y = pickle.load(f)
y
['Hello', ('pickle', 'world')]
x == y, x is y
(True, False)

除 了內置的類型,如以上例子中的列表,元組和字典,類實例也可被pickle到類似文件的對象中。


unpickle所得的對象具有與原對象相同的值和引用結構,但它位於不同的內存地址。無論在同一進程或另一進程unpickle,都是這樣。用Python的話來說,unpickle後的對象是“==”關係,但不是“is”關係: 

(2)封裝一下,houhou:

import pickle
def saveDbase(filename, object):
    file = open(filename, 'w')
    pickle.dump(object, file)          # pickle to file
    file.close( )                     # any file-like object will do

def loadDbase(filename):
    file = open(filename, 'r')
    object = pickle.load(file)         # unpickle from file
    file.close( )                     # re-creates object in memory
    return object

 參考文章:http://longmans1985.blog.163.com/blog/static/706054752009412105226942/

                    http://www.cppblog.com/jinq0123/archive/2009/07/03/89167.html

                  (兩個大牛的博客)

發佈了31 篇原創文章 · 獲贊 5 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章