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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章