Python文件_数据库与Pickle模块

一,数据库

数据库是一个用来管理已存储数据的文件,很多数据库都以类似字典的形式来管理数据,就是从键到键值成对映射。

数据库和字典的最大区别就在于数据库是存储在磁盘,或者其他永久性存储设备中,所以程序运行结束退出后,数据库依然存在。

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'\x80\x03]q\x00(K\x01K\x02K\x03e.'

虽然这种二进制的格式让人读起来挺复杂;但是这种设计能让 pickle 模块解译起来比较容易。

2.使用pickle.lods("load string"),会把原来存储的对象解译出来:

>>> t1 = [1, 2, 3]

>>> s = pickle.dumps(t1)

>>> s

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

>>> t2 = pickle.loads(s)

>>> t2

[1, 2, 3]

这里要注意了,虽然新的对象与旧的有一样的值,但(通常)并不是同一个对象,可以使用is方法来验证:

>>> t1 == t2

True

>>> t1 is t2

False

换句话说,就是说 pickle 解译的过程就如同复制了原有对象一样;是复制了一个对象,而非同一个对象。

有 pickle了,就可以把非字符串的数据也存到数据库里面了。

结束。

posted @ 2020-07-01 20:45  巴州夜雨  阅读(399)  评论(0编辑  收藏  举报