对象持久化

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

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

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

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

在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}