当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
学习笔记,有错必纠 数据库 数据库是一个有组织的用于存储数据的文件,许多数据库都像字典一样组织数据,因为它也将键映射到值上,数据库和字典之间最大的区别是数据库是保存

学习笔记,有错必纠


数据库



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



  • 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 pickle

t1 = [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 pickle


db = 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观察日志(part10)--__future__ 模块
下一篇:没有了
网友评论