持久化就是 程序数据在 持久状态瞬时状态 间转换的机制

通俗地讲,就是 瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据

比如常见的持久化方式就是将这些内存数据写到磁盘文件内,这样就可以让数据存活的更长

存入数据库也是持久化的一种方式

在python中实现数据的持久化可以采用以下方式:

  • pickle: python自带的模块
  • cPickle: c语言版本的Pickle,比pickle快很多
  • json: Json是一种文件格式,也可以用来对 对象持久化
  • ujson: 第三方模块,和json类似,比其他模块快很多,尤其是数据比较大的时候

pickle:持久化后的数据格式是bytes字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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,可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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}