day5模块学习--shelve模块
shelve模块
shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表、字典、或者用户自定义的类实例保存到shelve中,下次需要用的时候直接取出来,就是一个Python内存对象,不需要像传统数据库一样,先取出数据,然后用这些数据重新构造一遍所需要的对象。下面是简单示例:
shelve存储数据:
import shelve,datetime
names = ["alex","tom","tenglan"]
ages = [18,16,15]
f = shelve.open("database")
f["age"] = ages
f["name"] = names
f['date'] = datetime.date.today()
f.close()
上面代码中,我们使用shelve打开文件并往里面写入数据,是以字典形式写入数据,句柄f相当于字典一样,往文件添加数据,就跟我们往字典中添加数据的原理是一样的,如f["age"]=ages,键值对。
shelve读取数据:
import shelve,datetime
f = shelve.open("database")
print(f.keys())
print(f.values())
print(type(f.get("name")))
print(f.get("age"))
print(f.get("date"))
f.close()
运行如下:
KeysView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>)
ValuesView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>)
<class 'list'>
[, , ]
--
上面代码,我们把存储的数据对去出来了,可以看出,读取出来的数据类型没有改变,不是字符串,并且文件句柄就是一个字典,存储在文件句柄中一样。
shelve模块打开文件还有一个神奇的地方,就是如果这个文件不存在则创建,如果这个文件存在则读取。
这个有一个潜在的小问题,如下:
>>> import shelve
>>> s = shelve.open("test.dat")
>>> s["x"] = ["a","b","c"]
>>> s["x"].append("d")
>>> s["x"]
['a', 'b', 'c']
存储的d到哪里去了呢?其实很简单,d没有写入,我们把["a","b","c"]存储到了x,当我们再次读取s["x"]的时候,s["x"]只是一个拷贝,而我们没有将拷贝写回,所以当我们再次读取s["x"]的时候,它又从源中读取了一个拷贝,所以,我们新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量,如下所示: >>> import shelve
>>> s = shelve.open("test.dat")
>>> tmp = ["a","b","c"]
>>> s["x"] = tmp
>>> tmp.append("d")
>>> s["x"] = tmp
>>> s['x']
['a', 'b', 'c', 'd']
s.close()
文件写进去时候是不能直接修改的,就算修改了,也要重新写进去,这就是文件的要求,不可能修改之后,文件里面直接改变。
import shelve,datetime
f = shelve.open("database")
print(f.keys())
print(f.values())
print(type(f.get("name")))
print(f.get("age"))
print(f.get("date"))
f.close()
day5模块学习--shelve模块的更多相关文章
- logging模块、sys模块、shelve模块
一.logging模块 1.logging模块就是用于记录日志的,日志就是记录某个时间点,发生的事情. 2.记录日志是为了日后来复查,提取有用的信息. 3.如何去记录日志:可以直接打开文件,记录信息, ...
- python常用模块之shelve模块
python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...
- day5模块学习 -- os模块学习
python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...
- python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块
正则表达式 语法: mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...
- 序列化模块— json模块,pickle模块,shelve模块
json模块 pickle模块 shelve模块 序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. # 序列化模块 # 数据类型转化成字符串的过程就是序列化 # 为了方便存储和网 ...
- Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version . sys.maxint ...
- python16_day06【类、RE模块、subprocess模块、xml模块、shelve模块】
一.shelve模块 import shelve # 基于pickle模块, d = shelve.open('shelve_test') class Test(object): def __init ...
- Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块
5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 ...
- python 之 random 模块、 shutil 模块、shelve模块、 xml模块
6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...
随机推荐
- Kubernetes 1.5 配置dashboard
配置kubernetes的dashboard相对简单.同样的,只需要从源码中获取到dashboard-controller.yaml及dashboard-service.yaml文件,稍加修改即可: ...
- python 类与对象解析
类成员: # 字段 - 普通字段,保存在对象中,执行只能通过对象访问 - 静态字段,保存在类中, 执行 可以通过对象访问 也可以通过类访问 # ...
- UIScrollView的contentSize与contentOffset
UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应. ...
- 机器学习算法整理(五)决策树_随机森林——鹃尾花实例 Python实现
以下均为自己看视频做的笔记,自用,侵删! 还参考了:http://www.ai-start.com/ml2014/ In [8]: %matplotlib inline import pandas a ...
- Openssh版本升级(Centos6.7)
实现前提公司服务器需要进行安全测评,扫描漏洞的设备扫出了关于 openssh 漏洞,主要是因为 openssh的当前版本为5.3,版本低了,而yum最新的openssh也只是5.3,没办法只能到 rp ...
- 【精选】Ubuntu 14.04 安装Nginx、php5-fpm、ThinkPHP5.0(已经测试上线)
sudo apt-get update 安裝Nginx https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04 安裝完成後,Nginx的 ...
- Java并发编程原理与实战二十:线程安全性问题简单总结
一.出现线程安全性问题的条件 •在多线程的环境下 •必须有共享资源 •对共享资源进行非原子性操作 二.解决线程安全性问题的途径 •synchronized (偏向锁,轻量级锁,重量级锁) •vol ...
- 打包python脚本为exe的坎坷经历, by pyinstaller方法
打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...
- 【leetcode 简单】 第八十八题 猜数字大小
我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的接口 guess(in ...
- Python练习-函数(方法)的定义和应用
需求:对文件进行增删改查,使用函数调用的方式完成操作 # 编辑者:闫龙 import MyFuncation; Menu = ["查询","添加"," ...