python常用模块之shelve模块

python常用模块之shelve模块

shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型

我们在上面讲json、pickle模块的时候,说过都不能dump都多次,那么是真的吗?当然不是的, shelve模块就可以dump多次,shelve模块其实就是封装了pickle模块,并且顺序不会乱,因为shelve模块是k,v结构,给dump的数据指定一个名字,下次用这个名字就可以load回来。

序列化:
此模块的操作在linux系统下讲解

#!/usr/bin/python

import shelve

f = shelve.open("shelve_test")  # 使用shelve模块打开一个文件

names = ["li","xiao","rain"]  
info = {"name":"li","age":22}

f['names'] = names  # 持久化列表
f['info_dir'] = info  # 持久化字典

f.close()

shelve模块的操作:

# 在linux系统下,ipython3
In [1]: import shelve

In [2]: f = shelve.open("shelve_test")  # 此时的f就相当于是一个文件对象,即可以像字典样操作

In [3]: f.get('names')
Out[3]: ['li', 'xiao', 'rain']

In [4]: f.get('info_dir')
Out[4]: {'name': 'li', 'age': 22}

In [5]: f.keys() 
Out[5]: KeysView(<shelve.DbfilenameShelf object at 0x7f6a43269198>)  # 是一个列表

In [6]: list(f.keys())
Out[6]: ['names', 'info_dir']  # 列表中存了两个持久化的k

In [7]: list(f.items())
Out[7]: [('names', ['li', 'xiao', 'rain']), ('info_dir', {'name': 'li', 'age': 22})]

# 删除
In [8]: del f['names']  # 删除持久化的k

In [9]: f.close()  # 关闭文件

In [10]: f = shelve.open("shelve_test")  # 重新打开文件

In [12]: f.get('names')  # 无任何输出

# 增加
In [13]: f['scores'] = [1,2,3,4,"rain"]  # 

In [14]: f.close()

In [15]: f = shelve.open("shelve_test")

In [16]: f.get('scores')
Out[16]: [1, 2, 3, 4, 'rain']

# 修改,相当于是重新赋值
In [17]: f['scores']
Out[17]: [1, 2, 3, 4, 'rain']

In [18]: f['scores'] = [1,2,3,4,5]

In [19]: f.close()

In [20]: f = shelve.open("shelve_test")

In [24]: f['scores']
Out[24]: [1, 2, 3, 4, 5]

反序列化:

#!/usr/bin/python

import shelve

d = shelve.open('shelve_test')

# print(d['names'])  # 因为在之前的操作中已经删除了这个
print(d['info_dir'])

d.close()

输出结果为:

root@DESKTOP-G4V06P4:~/codes# python3 反序列化.py
{'age': 22, 'name': 'li'}

猜你喜欢

转载自www.cnblogs.com/xiaoyafei/p/9037195.html