shelve 之VS. pickle

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shelve 之VS. pickle相关的知识,希望对你有一定的参考价值。

shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式他只有一个函数就是open(),这个函数接收一个参数就是文件名,然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭。

                    >>> import shelve

            >>> sfile = shelve.open(‘shelve_test‘)    # 打开一个文件

            >>> sfile[‘k1‘] = [‘a‘,‘b‘]               # 持久化存储列表

            >>> sfile[‘k1‘]

            [‘a‘,‘b‘]

            >>> sfile.close()                  # 文件关闭

pickle 存储或读取方式如下:     

            将字符串转换成只有python能认识的字符串存储在文件中           

            >>> import pickle

            >>> pw = open(‘test‘,‘wb‘)

            >>> pw.write(pickle.dumps([‘a‘,‘b‘]))

            >>> pw.close()

            通过pickle.load 将字符串转成原数据形式

            >>> pr = open(‘test‘,‘rb‘)

            >>> prf = pickle.load(pr)

            >>> prf

            [‘a‘, ‘b‘]

但是现在我想持久化存储的列表进行操作,例如添加、删除、数据等,那么shelve 与 pickle是否都能这么操作呢?

            >>> import shelve

            >>> sfile = shelve.open(‘shelve_test‘) 

            >>> sfile[‘k1‘] = [‘a‘,‘b‘]

            >>> sfile[‘k1‘].append(‘c‘)

            >>> sfile[‘k1‘]

            [‘a‘, ‘b‘]

存储的c到哪里去了呢?其实很简单,c没有写回,你把[‘a‘, ‘b‘]存到了k1,当你再次读取sfile[‘k1‘]的时候,sfile[‘k1‘]只是一个拷贝,而你没有将拷贝写回,所以当你再次读取s[‘x‘]的时候,它又从源中读取了一个拷贝,

所以,你新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量,但这只能适用一个

对象,面对多个对象就束手无策了:

            >>> tmp = sfile[‘k1‘]

            >>> tmp.append(‘c‘)

            >>> sfile[‘k1‘] = tmp

            >>> sfile[‘k1‘]

            [‘a‘, ‘b‘, ‘c‘]

            >>> sfile[‘k2‘] = [‘1‘,‘2‘]

            >>> sfile[‘k2‘].append(‘3‘)  

            >>> sfile[‘k2‘]

            [‘1‘, ‘2‘]

那么怎么才能从根本上达到我想要的效果呢?咦!有一个办法,刚才提到c没有写回,如果让所有更

改数据都写回不就能达到效果了吗,那就是writeback,将writeback置为True,见效果:

            >>> sfile = shelve.open(‘shelve_test‘) 

            >>> sfile.writeback = True

            >>> sfile[‘k1‘]

            [‘a‘, ‘b‘, ‘c‘]

            >>> sfile[‘k1‘].append(‘d‘)

            >>> sfile[‘k1‘]

            [‘a‘, ‘b‘, ‘c‘, ‘d‘]

            >>> sfile[‘k2‘] = [‘1‘,‘2‘]

            >>> sfile[‘k2‘]

            [‘1‘, ‘2‘]

            >>> sfile[‘k2‘].append(‘3‘)

            >>> sfile[‘k2‘]

            [‘1‘, ‘2‘, ‘3‘]



            


        

本文出自 “纷繁中享受技术的简单喜悦” 博客,请务必保留此出处http://51enjoy.blog.51cto.com/8393791/1743984

以上是关于shelve 之VS. pickle的主要内容,如果未能解决你的问题,请参考以下文章

day⑥:shelve模块

Python基础(12)_python模块之sys模块logging模块序列化json模块pickle模块shelve模块

pickle与shelve

shelve 为pickle的更上层面的加工

python 模块之-shelve

实例存储之shelve