学习笔记,有错必纠
数据库
数据库是一个有组织的用于存储数据的文件,许多数据库都像字典一样组织数据,因为它也将键映射到值上,数据库和字典之间最大的区别是数据库是保存在磁盘上的(或者其他永久存储上),所以当程序结束时它也能持续存在。
- 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.'
<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 dbmimport 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!