import shelve
import datetime
d = shelve.open('shelve_test')
'''写入文件'''
info = {'age': 22, 'job': 'IT'}
name = ['Jack', 'Rose']
d['name'] = name
d['info'] = info
d['data'] = datetime.datetime.now()
d.close()
'''读取文件'''
d = shelve.open('shelve_test')
print(d.get('name'))
print(d.get('info'))
print(d.get('date'))
d.close()
shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表、字典、或者用户自定义的类实例保存到shelve中,下次需要用的时候直接取出来,就是一个Python内存对象,不需要像传统数据库一样,先取出数据,然后用这些数据重新构造一遍所需要的对象。
可以看出shelve模块和json对文件的操作是很像的,但是保存文件时有三个文件,如图:
具体不用管这三个文件的格式,正常的读写就行了。
模块名称 | 描述 | 提供的api |
---|---|---|
json | 用于实现Python数据类型与通用(json)字符串之间的转换 | dumps()、dump()、loads()、load() |
pickle | 用于实现Python数据类型与Python特定二进制格式之间的转换 | dumps()、dump()、loads()、load() |
shelve | 专门用于将Python数据类型的持久化到磁盘,shelf是一个类似dict的对象,操作十分便捷 | open() |
json模块:
下面通过一些示例来学习:
首先我们来看json的dumps和loads方法
1
2
3
4
5
6
|
s1 = { "k1" : "v1" }
st = json.dumps(s1)
print (st, type (st))
s = '{"k1":"v1"}'
dic = json.loads(s)
print (dic, type (dic))
|
输出结果为:
1
2
|
{ "k1" : "v1" } < class 'str' >
{ 'k1' : 'v1' } < class 'dict' >
|
可以看出json的dumps方法处理数据时会将数据转换为字符类型,loads则会重新还原它的类型。
再来看json的dump和load方法,通过示例来了解:
1
2
3
4
|
li = [ 11 , 22 , 33 ]
li = json.dump(li, open ( 'db' , 'w' ))
li = json.load( open ( 'db' , 'r' ))
print (li, type (li))
|
即Json的load要接open的文件对象,dump同理。
Json模块dumps、loads、load、dump的区别:
load,dump可加载外部文件,处理文件的数据,dumps,loads主要处理内存中的数据
pickle模块:
下面我们来看pickle的dumps和loads方法,通过示例我们来了解:
1
2
3
4
5
6
|
import pickle
i = [ 11 , 22 , 33 ]
r = pickle.dumps(li)
print (r)
result = pickle.loads(r)
print (result)
|
结果为:
1
2
|
b '\x80\x03]q\x00(K\x0bK\x16K!e.'
[ 11 , 22 , 33 ]
|
pickle的dupms方法会将数据存为pickle特有的数据类型
再看pickle的dump和load方法,通过示例我们来了解:
1
2
3
4
5
|
import pickle
i = [ 11 , 22 , 33 ]
pickle.dump(i, open ( 'db' , 'wb' ))
result = pickle.load( open ( 'db' , 'rb' ))
print (result)
|
需要注意的是dump文件或者load文件是需要使用二进制。