python观察日志(part9)--数据库与pickle模块

网友投稿 300 2022-08-31


python观察日志(part9)--数据库与pickle模块

学习笔记,有错必纠

数据库

数据库是一个有组织的用于存储数据的文件,许多数据库都像字典一样组织数据,因为它也将键映射到值上,数据库和字典之间最大的区别是数据库是保存在磁盘上的(或者其他永久存储上),所以当程序结束时它也能持续存在。

dbm模块

模块dbm提供了接口用于创建和更新数据库文件。

import dbmdb = 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'] = 10TypeError: 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.'

我们还可以使用​​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 dbmimport pickledb = dbm.open('testdatabase', 'c')t = [1, 2, 3]s = pickle.dumps(t)db['list01'] = sprint(db['list01'])db.close()

输出结果:

b'\x80\x03]q\x00(K\x01K\x02K\x03e.'

perfect!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot配置项目访问路径URL的根路径方式
下一篇:ZooKeeper官方文档之Java案例解读
相关文章

 发表评论

暂时没有评论,来抢沙发吧~