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‘]

时间: 2025-01-19 20:48:55

shelve 之VS. pickle的相关文章

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

5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 5.1 使用sys.argv进行登录判断,跳过 i/o阻塞 #使用sys.argv进行登录判断,跳过 i/o阻塞 import s

json&pickle模块shelve模块

json 在不同的编程语言之间传递对象 1 dic = {'name': 'alvin', 'age': 23, 'sex': 'male'} 2 print(type(dic)) # <class 'dict'> 3 4 j = json.dumps(dic) 5 print(type(j)) # <class 'str'> 6 7 f = open('序列化对象', 'w') 8 f.write(j) # -------------------等价于json.dump(dic,

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

json&amp;pickle&amp;shelve模块

之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值. 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思

python序列化:json,pickle,shelve

什么是序列化 什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化.在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等.程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输. 序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~ json模块 json 模块就用于序列化和反序

Python全栈开发记录_第八篇(模块收尾工作 json &amp; pickle &amp; shelve &amp; xml)

由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值. 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pic

json pickle shelve

我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值. 1 import json 2 x="[null,true,false,1]" 3 print(eval(x)) 4 print(json.loads(x)) 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的

Python学习第十三天 time datetime random os sysshutil json pickle shelve xml configparser hashlib suprocess logging re

https://www.cnblogs.com/yuanchenqi/articles/5732581.html https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label2 一 time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是fl

模块 json,sys,pickle,logging

sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 ========================================================sys.argv de 作用 返回的命令是列表,通过列表把用户名和密码直接赋值 -------------------------------------sys.pat