python shelve模块的使用及注意点

介绍

shelve是python中一种存储结构化数据的模块,用法跟字典相似,以键值对的形式储存。基本使用方法:

1.引入模块

import shelve

2.创建数据文件:

with shelve.open(filename) as object:

object = shelve.open(filename)

两种文件操作的方式均可以。不难看出,对shelf文件数据的读写是不用指定文件打开方式的,直接open就可以了,跟json比起来较方便,尽管只适用于python程序。对于shelf内容的操作,不用像文件操作一样,需要readline等先对数据做一波处理,也不用像pickle/json一样需要load/dump,更不需要像pformat一样将数据结构输出为字符串,格式化写入程序文件进行调用,对于shelf的操作,如上object即可视为字典变量,操作同字典

3.shelf的键值只能存储基础的数据结构,例如file类型就不行

4.shelf虽然同字典很类似,但略有差别,key只能是字符串类型,不能是数值

注意点

最近在code刻意使用了一下shelve模块,确实相当好用,几乎跟字典一摸一样(当然不是这样),由此遇到了两个问题,也花了一点时间去发现问题,更为深入的了解了一下shelve模块。上代码。

  1. 问题一:
import shelve
with shelve.open('asdf') as b:
    b = {
        'b':{'d':5000},
        'c':{'d':5000}
    }
    if 'b' in b:
        print('yes')
    print (list(b.keys()))
    print(b['c']['d'])
>>>>
yes
['b', 'c']
5000

乍一看,确实没有问题,这就算是数据存储好了,那么模拟读取数据试试看。

import shelve
with shelve.open('asdf') as b:
    # b = {
    #     'b':{'d':5000},
    #     'c':{'d':5000}
    # }
    if 'b' in b:
        print('yes')
    print (list(b.keys()))
    print(b['c']['d'])
>>>>
[]
Traceback (most recent call last):
  File "c:\Users\Stan Pao\Desktop\办公\Python\Test\temp_test.py", line 13, in 
    print(b['c']['d'])

执行抛错,可以看出,存储的数据呢?这跟是空的么。检查一下生成的三个文件,好像确实都是空的(windows下shelf文件是生成三个,两个可读一个不可读,linux下生成一个二进制文件,不可读)。
直接上结论:经过一番尝试,shelf键值对进行数据结构存储时,只能严格按照key = value这样的形式存储,而不能想当然完全将shelf视为字典直接进行初始化。

import shelve
with shelve.open('asdf') as b:
    b['b'] = {'d':5000}
    b['c'] = {'d':5000}
    if 'b' in b:
        print('yes')
    print (list(b.keys()))
    print(b['c']['d']

如此即可。

  1. 问题二:
    本来想从shelf中获得数据修改以保存,但是失败了。
import shelve
with shelve.open('asdf') as b:
    b['b'] = {'d':5000}
    b['c'] = {'d':5000}
    b['c']['d'] = 1000
    if 'b' in b:
        print('yes')
    print (list(b.keys()))
    print(b['c']['d'])
>>>>
yes
['b', 'c']
5000

明明对其赋值成为1000,怎么没变呢?shelf默认初始化存储数据之后是不进行会写,因此之后的数据变动不会被写入,因此只要指定writeback参数即可

import shelve
with shelve.open('asdf',writeback=True) as b:
    b['b'] = {'d':5000}
    b['c'] = {'d':5000}
    b['c']['d'] = 1000
    if 'b' in b:
        print('yes')
    print (list(b.keys()))
    print(b['c']['d'])
>>>>
yes
['b', 'c']
1000

你可能感兴趣的:(Python)