• 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'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了,就可以把非字符串的数据也存到数据库里面了。

    结束。

  • 相关阅读:
    ASCII、GBK、Unicode、UTF-8、ISO-8859-1等常见字符编码介绍
    HTTP协议简介
    关于无知的一点思考
    Java 8 新特性之lambda表达式
    Java 8 新特性之新的日期时间库
    【java】<Jsoup>获取网页中的图片
    【数据结构】二叉树
    【转载】Android中UI线程与后台线程交互设计的5种方法
    【数据结构】广义表
    【c语言】数据结构(约瑟夫生者死者游戏的问题)
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13221188.html
Copyright © 2020-2023  润新知