最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 一文读懂Python中的shelve模块

    正文概述    2020-08-26   260

    一文读懂Python中的shelve模块

    shelve模块

    使用json或者pickle持久化数据,能dump多次,但load的话只能取到最新的dump, 因为先前的数据已经被后面dump的数据覆盖掉了。如果想要实现dump多次不被覆盖,就可以想到使用shelve模块。shelve模块可以持久化所有pickle所支持的数据类型。另外,写程序的时候如果不想用关系数据库那种重量级的去存储数据,也可以用到shelve。

    shelve是用key来访问的,使用起来和字典类似。 要注意的是,在shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。

    另外,shelve其实用anydbm去创建DB并且管理持久化对象的。

    shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。 可以像字典一样使用get来获取数据等。

    如下操作:

    import shelve
    f_shelve = shelve.open('shelve') # 创建一个文件句柄
    f_shelve["name"] = "小明" # 向文件中存放数据
    f_shelve["age"] = 21 # 向文件中存放数据
    f_shelve["sex"] = "男"

    运行后会生成3个文件:shelve.bak shelve.dat shelve.dir

    shelve.dat 存储的就是b字节数据类型的数据。bak和dir后缀从字面上看是备份和目录,具体做什么的不是很清楚。

    相关推荐:《Python视频教程》

    当我们写好数据后,如何读取呢?

    import shelve
    f_shelve = shelve.open('shelve') # 创建一个文件句柄
    # 打印文件内容,和类型
    print(f_shelve["name"],f_shelve["age"],f_shelve["sex"],type(f_shelve))

    打印内容如下

    小明 21 男 <class 'shelve.DbfilenameShelf'>

    既然f_shelve类似于字典,那我们也可以使用for循环进行打印,如下:

    import shelve
    f_shelve = shelve.open('shelve') # 创建一个文件句柄
    # 使用for循环打印内容
    for k,v in f_shelve.items():
        print(k,v)

    打印内容如下

    name 小明
    age 21
    sex 男

    f_shelve现在是一个特殊的文件句柄,它可以执行字典的多数方法,对文件里的数据进行操作。

    import shelve
    f_shelve = shelve.open('shelve') # 创建一个文件句柄
    f_shelve["list"] = [1,2,3]  # 向文件中添加数据列表
    f_shelve["list"].append("abc") # 向列表中追加内容.
    f_shelve["list"].pop(1) # 从列表中删除一个元素
    f_shelve["name"] = "小明" # 向文件中追加内容
    f_shelve["name"] = "小红" # 修改name所对应的值
    print(f_shelve["list"],f_shelve["name"],sep="\n")

    打印内容如下

    [1, 2, 3]
    小红

    通过上面的打印内容我们可以发现,我们将列表写入文件后,然后在读取出来进行追加和删除元素,并没有对文件产生影响,文件中的列表内容还是原来的值。而我们向文件中添加字符串时,在读取出来对字符串进行修改发现数据被修改了。

    由此我们可以知道在向文件中写入一个可变的数据时,如果读取出来对数据进行修改只是在内存中的修改,修改后的数据并没有被真正写入到文件中。那么我们该如何进行操作呢?这时就需要回写了。

    import shelve
    # 创建一个特殊的文件句柄,并添加回写功能
    f_shelve = shelve.open('shelve',writeback=True)  # 启用会写
    f_shelve["list"] = [1,2,3]  # 向文件中添加数据列表
    f_shelve["list"].append("abc") # 向列表中追加内容.
    f_shelve["list"].pop(1) # 从列表中删除一个元素
    print(f_shelve["list"])

    打印内容如下

    [1, 3, 'abc']

    这回我们在修改列表时,可以看出列表的数据确实被修改了。

    总结如下:

    1、shelve模块将内存数据以字典的类型(key,value)通过文件持久化,模拟出简单的db效果。

    2、shelve模块可以持久化任何pickle所支持的python数据格式,但是它的key必需得是字符串。

    3、shelve可以看作是pickle模块的一个封装,但它实现了可以多次dump(后面的dump不会覆盖前面的)和多次load。

    4、shelve访问己有key时,实际上取出的是数据源给出的一份拷贝,所以对于拷贝做出的增加和删除等操作都需要用writeback=True参数才能实现写入回文件中进行修改。

    5、shelve对于d[key] = data这种操作,视为存储数据,无则新增,有则覆盖,

    对与访问key当中的值(条目)进行修改,默认不回写并不矛盾和冲突。

    相关推荐:

    一文带你读懂Python中的pickle模块


    下载网 » 一文读懂Python中的shelve模块

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元