一,数据库
数据库是一个用来管理已存储数据的文件,很多数据库都以类似字典的形式来管理数据,就是从键到键值成对映射。
数据库和字典的最大区别就在于数据库是存储在磁盘,或者其他永久性存储设备中,所以程序运行结束退出后,数据库依然存在。
1.dbm模块提供了一个创建和更新数据库文件的交互接口。
>>> import dbm
>>> db = dbm.open('my-photo', 'c')
后面这个 'c' 是一个模式,意思是如果该数据库不存在就创建一个新的。得到的返回结果就是一个数据库对象了,用起来很多的运算都跟字典很像。
2.创建一个新的项的时候,dbm就会对数据库文件进行更新了:
db['tom.png'] = 'photo of tom.'
读取里面的某一项的时候,dbm 就读取数据库文件:
>>> db['tom.png']
b'photo of tom.' #这里以b开头,返回的是一个二进制对象。
3.如果对一个已经存在值的键进行赋值,dbm 就会把旧的值替换成新的值:
>>> db['tom.png']
b'photo of tom.'
>>> db['tom.png'] = 'this is jack'
>>> db['tom.png']
b'this is jack'
4.字典的一些方法,比如 keys 和 items,不能用于数据库对象。但用一个 for 循环来迭代是可以的:
$ cat c.py
#!/bin/python
import dbm
db = dbm.open('myphoto', 'c')
db['tom.png'] = 'photo of tom'
db['jack.png'] = 'photo of jack'
db['jim.png'] = 'photo of jim'
for key in db.keys():
print(key, db[key])
db.close()
$ python3 c.py
b'jack.png' b'photo of jack'
b'tom.png' b'photo of tom'
b'jim.png' b'photo of jim'
5.同其他文件一样,用完了之后你得用 close 方法关闭数据库:
>>>db.close()
二,Pickle模块
dbm 的局限就在于键和键值必须是字符串或者二进制;如果用其他类型数据,就得到错误了。
1.这时候就可以用 pickle 模块了。该模块可以把几乎所有类型的对象翻译成字符串模式,以便存储在数据库中,然后用的时候还可以把字符串再翻译回来。
pickle.dumps 接收一个对象做参数,然后返回一个字符串形式的内容翻译(dumps即dump string的缩写):
>>> import pickle
>>> t = [1, 2, 3]
>>> pickle.dumps(t)
b'x80x03]qx00(Kx01Kx02Kx03e.'
虽然这种二进制的格式让人读起来挺复杂;但是这种设计能让 pickle 模块解译起来比较容易。
2.使用pickle.lods("load string"),会把原来存储的对象解译出来:
>>> t1 = [1, 2, 3]
>>> s = pickle.dumps(t1)
>>> s
b'x80x03]qx00(Kx01Kx02Kx03e.'
>>> t2 = pickle.loads(s)
>>> t2
[1, 2, 3]
这里要注意了,虽然新的对象与旧的有一样的值,但(通常)并不是同一个对象,可以使用is方法来验证:
>>> t1 == t2
True
>>> t1 is t2
False
换句话说,就是说 pickle 解译的过程就如同复制了原有对象一样;是复制了一个对象,而非同一个对象。
有 pickle了,就可以把非字符串的数据也存到数据库里面了。
结束。