python观察日志(part9)--数据库与pickle模块
学习笔记,有错必纠
数据库
数据库是一个有组织的用于存储数据的文件,许多数据库都像字典一样组织数据,因为它也将键映射到值上,数据库和字典之间最大的区别是数据库是保存在磁盘上的(或者其他永久存储上),所以当程序结束时它也能持续存在。
- dbm模块
模块dbm提供了接口用于创建和更新数据库文件。
import dbm
db = dbm.open('testdatabase', 'c')
在dbm.open
方法中,若把参数设置为"c",则意味着如果数据库不存在,则创建该数据库。该方法会返回一个数据库对象。
当创建一个新项时,dbm会更新数据库文件,当访问数据库中的一项时,dbm会读取文件:
In [41]: import dbm...: ...: db = dbm.open('testdatabase', 'c')...: db['Bunny.png'] = 'Photo of Huang.'...: print(db['Bunny.png'])
b'Photo of Huang.'
我们看到,输出的结果以b开头,是一个字节序列。
如果对一个已经存在的键赋值,dbm会替换旧值:
In [42]: db['Bunny.png'] = 'Photo of Xiao Huang.'...: print(db['Bunny.png'])
b'Photo of Xiao Huang.'
和其他文件一样,当操作结束时,我们需要关闭数据库:
db.close()
dbm的限制之一是键和值都必须是字符串或字节,如果尝试使用其他类型,则会报错:
In [46]: db['test'] = 10
TypeError: values must be bytes or strings
这时,pickle模块就可以帮上忙了!
pickle模块
pickle
模块实现了用于序列化和反序列化Python对象结构的二进制协议。pickle
模块可以将python中几乎所有的数据类型(列表,字典,集合,类等)进行序列化。
我在网上查了一下关于序列化和反序列化的定义
解释1:
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。
以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
嗯,这个解释还是挺好理解的。我们再以JAVA为例,看一下对于序列化和反序列化的解释。
解释2:
Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程
感觉在python中序列化和反序列化的应用和JAVA很像鸭!
通过下面的实验,我们可以看到,python中利用pickle.dumps
函数对列表进行序列化,可以得到字节数据;再利用pickle.loads
反序列化,可以重新得到列表。
- dumps与loads
pickle.dumps
接收一个对象作为参数,并返回它的字节串形式:
In [58]: import pickle...: ...: t1 = [1, 2, 3]...: s = pickle.dumps(t1)...: print(s)...: print(type(s))
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
<class 'bytes'>
我们还可以使用pickle.loads
重新构造对象:
import picklet1 = [1, 2, 3]
s = pickle.dumps(t1)
t2 = pickle.loads(s)
print(t2)print('值相同么:', t1 == t2)
print('是同一个对象么', t1 is t2)
输出结果:
[1, 2, 3]
值相同么: True
是同一个对象么 False
利用pickle模块,我们向数据库中存入列表:
import dbm
import pickledb = dbm.open('testdatabase', 'c')t = [1, 2, 3]
s = pickle.dumps(t)
db['list01'] = s
print(db['list01'])db.close()
输出结果:
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
perfect!
python观察日志(part9)--数据库与pickle模块相关推荐
- [python](windows)分布式进程问题:pickle模块不能序列化lambda函数
运行错误:_pickle.PicklingError: Can't pickle <function <lambda> at 0x000002BAAEF12F28>: attr ...
- MongoDB数据库(8.Python中使用mongodb数据库以及pymongo模块用法)
在Python中使用MongoDB数据库,首先要下载pymongo模块 直接在命令行 pip install pymongo 就可以了 Python中使用pymongo模块对MongoDB数据 ...
- python 列表 字典 读写文件:pickle模块的基本使用
建议大家使用cPickle,速度更快!!! python数据持久存储:pickle模块的基本使用(转载) 作者: pzxbc 出处: http://pzxbc.cnblogs.com/ 本文版权归作者 ...
- Python学习日志16 - 数据库SQL查询
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...
- python观察日志(part10)--__future__ 模块
学习笔记,有错必纠 __future__模块 我们利用官方文档学习一下__future__模块: To avoid confusing existing tools that analyze impo ...
- python全栈开发-json和pickle模块(数据的序列化)
一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...
- python观察日志(part24)--列表和numpy数组扁平化
学习笔记,仅供参考,有错必究 参考文献:python–列表.数组扁平化:你知道如何将python中嵌套的列表扁平化吗? 列表扁平化 方案1 print(sum([[1, 2, 3], ["s ...
- R语言观察日志(part9)--RMarkdown之输出格式
学习笔记,仅供参考,有错必纠 参考自:官方文档rmarkdown;R Markdown中配置python R Markdwon 输出格式 设置render的output_format参数,可以将.Rm ...
- python观察日志(part22)--设置工作目录及文件读取
学习笔记,仅供参考 参考自:pandas.read_csv参数详解:<python编程从数据分析到数据编程> 查看并更改当前工作目录 当前工作目录就是python(准确的说,是python ...
最新文章
- android 字体像素转换工具类_Android中px与dip,sp与dip等的转换工具类
- Python语言的全部数据类型分享!
- HDU3400+三分
- php中取出数组中指定的值,PHP除开数组中指定的值
- JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)
- 阶段3 3.SpringMVC·_05.文件上传_4 文件上传之Springmvc方式上传代码
- LSET与LREM结合删除list中特定索引的值
- Atom: 几个常用的快捷键,恢复主菜单
- Quartus II 15详细安装教程
- Visio2013 Professional专业版密钥
- 怎样在计算机上注册dll文件,win10如何注册dll文件_win10系统dll文件怎样安装
- 【建站指南】网站搭建需要准备什么?
- matlab data数据类型,MATLAB - 数据类型
- 2021年1月PHP面试题总结
- 腾云忆想技术干货|TSF微服务治理实战系列(一)——治理蓝图
- 技术面试(一)认识技术面试
- flutter 自定义TabBar +自定义Indicator
- 用Java编程开发“六级单词强化记忆”游戏
- 计算机efs加密,EFS加密
- python3中 operator模块用法介绍
热门文章
- 深度学习(二十三)——Fast Image Processing, SVDF, LCNN, LSTM进阶
- java mock什么意思_java @Mock, @MockBean 与 Mockito.mock( ) 之间的差异
- 两个sql交集_如何使用性能分析工具定位SQL执行慢的原因?
- java诸神之战游戏_mj回溯算法 - osc_7bgz0no1的个人空间 - OSCHINA - 中文开源技术交流社区...
- Java的回调机制--学习笔记
- Hadoop集群(第3期)_VSFTP安装配置
- oracle修改参数
- 一个静态库框架模板: iOS Universal Framework Mk 7
- Sharepoint学习笔记—Ribbon系列-- 3.在Ribbon中找到正确的Location
- Linux系统/网络管理