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 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!

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/106167713
今日推荐