对象持久化
2022年4月20日大约 2 分钟
持久化就是 程序数据在 持久状态 和 瞬时状态 间转换的机制
通俗地讲,就是 瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据
比如常见的持久化方式就是将这些内存数据写到磁盘文件内,这样就可以让数据存活的更长
存入数据库也是持久化的一种方式
在python中实现数据的持久化可以采用以下方式:
pickle
: python自带的模块cPickle
: c语言版本的Pickle,比pickle快很多json
: Json是一种文件格式,也可以用来对 对象持久化ujson
: 第三方模块,和json类似,比其他模块快很多,尤其是数据比较大的时候
pickle:持久化后的数据格式是bytes字符串
In [10]: stu = {'name':'小米', 'age':23, 'gender':True}
In [11]: import pickle
In [12]: s = pickle.dumps(stu)
In [13]: s
Out[13]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe5\xb0\x8f\xe7\xb1\xb3q\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00genderq\x04\x88u.'
In [14]: pickle.loads(s)
Out[14]: {'name': '小米', 'age': 23, 'gender': True}
In [14]: pickle.loads(s)
Out[14]: {'name': '小米', 'age': 23, 'gender': True}
In [15]: with open('stu.json', 'wb') as f:
...: pickle.dump(stu, f)
...:
In [16]: with open('stu.json', 'rb') as f:
...: data = pickle.load(f)
...:
In [17]: data
Out[17]: {'name': '小米', 'age': 23, 'gender': True}
cPickle:持久化后的数据格式是bytes字符串
在python2.x中,cPickle
是附带的标准库;在python3.x上,cPickle
已经从cPickle
变成了cPickle_pickle
。因此,在python3.x中,如果要使用cPickle
,可以执行以下操作:
In [18]: stu = {'name':'小米', 'age':23, 'gender':True}
In [19]: import _pickle as cPickle
In [20]: s = cPickle.dumps(stu)
In [21]: s
Out[21]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe5\xb0\x8f\xe7\xb1\xb3q\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00genderq\x04\x88u.'
In [22]: cPickle.loads(s)
Out[22]: {'name': '小米', 'age': 23, 'gender': True}
In [23]: with open('stu.json', 'wb') as f:
...: cPickle.dump(stu, f)
...:
In [24]: with open('stu.json', 'rb') as f:
...: data = cPickle.load(f)
...:
In [26]: data
Out[26]: {'name': '小米', 'age': 23, 'gender': True}
Json: 持久化后的数据格式是str字符串
In [18]: stu = {'name':'小米', 'age':23, 'gender':True}
In [19]: import json
In [20]: s = json.dumps(stu)
In [21]: s
Out[21]: '{"name":"\\u5c0f\\u7c73","age":23,"gender":true}''
In [22]: json.loads(s)
Out[22]: {'name': '小米', 'age': 23, 'gender': True}
In [23]: with open('stu.json', 'w') as f:
...: json.dump(stu, f)
...:
In [24]: with open('stu.json', 'r') as f:
...: data = json.load(f)
...:
In [26]: data
Out[26]: {'name': '小米', 'age': 23, 'gender': True}
uJson:持久化后的数据格式是str字符串
In [18]: stu = {'name':'小米', 'age':23, 'gender':True}
In [19]: import ujson
In [20]: s = ujson.dumps(stu)
In [21]: s
Out[21]: '{"name":"\\u5c0f\\u7c73","age":23,"gender":true}''
In [22]: ujson.loads(s)
Out[22]: {'name': '小米', 'age': 23, 'gender': True}
In [23]: with open('stu.json', 'w') as f:
...: ujson.dump(stu, f)
...:
In [24]: with open('stu.json', 'r') as f:
...: data = ujson.load(f)
...:
In [26]: data
Out[26]: {'name': '小米', 'age': 23, 'gender': True}