python函数持久化 python持久层框架

python pickle——万能持久化工具 今天的故事从持久化开始,最早知道持久化这个是上历史课上,太祖论断的xxx持久化,从此持久化就是一个高端、大气、上档次的词语 。后来转行当程序员,老是听小伙伴说数据持久化,不明觉厉,不过因为懒,也没去搞明白是啥意思!今天刚好想学习pickle的知识 , 看到了持久化一词,去查了一下,哦 , 原来如此,妙不可言——果然是假大空!我已经浅薄地理解为把数据存储起来!
之前在 python基础 里面我们有谈到过python文件读写,其实就是一种字符串的持久化方式 。那么我们可以把数据想办法装换为字符串 , 就可以实现数据的持久化 。那么有没有更好的方式呢?当然有啦,今天一起学习python特有的数据持久化模块 pickle。
pickle的口号是 , 一切都对象皆可持久化,简单方便直接暴力美啊 , 大家有什么想存储的对象,赶紧用pickle吧!pickle还有一个小兄弟json,它能对json格式对象进行持久化或者加载,json格式文件在很多语言都是通用的,所以处理json文件时候建议使用json模块 。类似numpy里面也定义了save持久化的函数,但是底层其实是使用的pickle方法...
python字典持久化值有单引号#有单双引号也应该没有问题?。聪吕齭p'am na"me
#如果要持久化大量数据的话,推荐使用gdbm,有lock功能,动态增删纪录,
#更主要的是属于kvs,内存方面完胜,速度快,但是第一次创建时慢 。
import pickle
table = {'a': [1, 2, 3],'b': ["sp'am", 'eggs'],'c': {'na"me':'bob'}}
f = open('f:\dic.txt', 'w')
pickle.dump(table, f)
f.close()
#读取字典
f=open('f:\dic.txt', 'r')
table=pickle.load(f)
print table#输出{'a': [1, 2, 3], 'c': {'na"me': 'bob'}, 'b': ["sp'am", 'eggs']}
如何持久化python对象1. 使用(dbhash/bsddb, dbm, gdbm, dumbdbm 等)以及它们的"管理器"( anydbm ) 。只提供了 Python 字符串的永久性储存. 提供一个类似字典和文件的对象,可以完成字符串的永久性存储 。
2. 使用marshal和pickle来序列化python对象,并具备存储到介质上的功能 。两者的区别在于:marshal只能处理简单的Python对象 , 包括数字、序列、映射、以及代码对象;而pickle还可以处理递归对象,被不同地方多次引用的对象,以及用户定义的类和实例 。其中 , pickle有一个C语言实现的版本——cPickle,具有更高的效率,建议使用cPickle 。
3. 虽然pickle提供非常强大的功能了,已经可以满足我们大部分的需求了,但是,人类的需求是无止境的,光序列化不行?。?只用 pickle 不能解决命名和查找 pickle 文件这样的问题,要是可以对序列化的对象提供管理功能,支持并发访问就好了 。因此 , 人们发明了shelve模块 , 它是前两者的综合 。shelve模块使用anydbm模块寻找合适的DBM模块,然后使用cPickle来完成对象存储转换过程 。shelve模块允许对数据库文件进行并发的读访问,但不允许共享读/写访问 。
4. 还有一种方案,是在IBM的网站上看到的 。那就是ZODB了 。ZODB比简单的 pickle 文件更健壮以及更具有可伸缩性 。ZODB是一个针对Python的Z对象数据库,是一个健壮的、多用户的和面向对象的数据库系统,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制 。其实 , ZODB也依靠Python 的本机序列化能力 , 而且要有效地使用 ZODB,必须充分了解 pickle 。
5. 最后一只知道的解决持久性问题的方法是 Prevayler,PyPerSyst 将整个对象系统保存在内存中 , 并通过不时地将系统快照 pickle 到磁盘以及维护一个命令日志(通过此日志可以重新应用最新的快照)来提供灾难恢复 。所以,尽管使用 PyPerSyst 的应用程序受到可用内存的限制,但好处是本机对象系统可以完全装入到内存中,因而速度极快,而且实现起来要比如 ZODB 这样的数据库简单,ZODB 允许对象的数目比同时在能内存中所保持的对象要多 。

推荐阅读