Python 序列化

一、序列化介绍

    在程序的运行过程中,我们定义的变量都是存放在内存中的,如 name = "Tom" ,我们也可以随时修改变量,如 name = "John",

但是一旦程序运行结束,变量所占用的内存就被系统回收,也就是变量被销毁了,下次重新运行程序时,变量又被初始化为 name = "Tom"

因此,有没有什么办法能把修改后的变量保存下来呢?或者说把存放在内存中的变量存放到磁盘中,实现永久保存,这就需要用到序列化

什么是序列化:把内存中的对象(变量也是一个对象)持久保存到磁盘中的过程就是序列化,一般我们以文件的形式保存到磁盘中

什么是反序列化:将文件中的数据重新解析为一个Python对象,然后保存到内存中的过程,就是反序列化

序列化应用在哪里呢?比如我们在玩仙剑奇侠传这个单机游戏时,游戏是需要运行在内存中的,然后我们进行存档,存档的过程就是序列化,

会把在内存中的游戏数据保存成一个磁盘文件,下次我们读取存档的时候,就会读取这个文件,把磁盘文件反序列化到内存中,继续游戏进度。


实现序列化的模块:

模块名 描述 提供的API
pickle 用于实现将 Python 对象转换成特定的二进制,然后持久化保存到磁盘文件中 dump() 、load()
dumps() 、loads()
json 用于实现将 Python 对象转换成 json 字符串,然后持久化保存到磁盘文件中 dump() 、load()
dumps() 、loads()
shelve 用于实现将 Python 对象转换成类似字典的对象,然后持久化保存到磁盘文件中 open()

 

 

 

 

 

 

 


二、pickle 模块

pickle.dump(obj,file) :用于将一个对象序列化到磁盘文件中
pickle.load(file) :用于将磁盘文件中的数据反序列化到内存中,结果返回一个对象,需要用一个变量来接收

pickle.dumps(obj) :用于将一个对象序列化成一个字符串,并不保存到磁盘文件中,结果返回一个字符串对象,需要用变量来接收
pickle.loads() :用于将字符串反序列化成 python 对象

In [1]: import pickle

In [2]: data = {'name': 'Tom', 'age': 22}     # 先定义一个对象
 
In [3]: with open('1.pickle', 'wb') as fd:    # 序列化,因为是转换成二进制数据,所以要以'wb'方式写入文件
   ...:     pickle.dump(data, fd)
   ...:     

In [4]: with open('1.pickle', 'rb') as fd:    # 反序列化,同理要以'rb'方式读取文件
   ...:     data2 = pickle.load(fd)
   ...:     

In [5]: data2
Out[5]: {'age': 22, 'name': 'Tom'}
In [1]: import pickle

In [2]: data = {'name': 'Tom', 'age': 22}

In [3]: data2 = pickle.dumps(data)    # 序列化

In [4]: type(data2)                   # 结果是一个字符串
Out[4]: str

In [5]: pickle.loads(data2)           # 反序列化
Out[5]: {'age': 22, 'name': 'Tom'}

 

三、json 模块

pickle模块是用 python 写的,只适用于 python 语言,而 json 模块是跨语言的,可以使用 json 与其他语言进行数据交互

json.dump(obj,file) :用于将一个对象序列化到磁盘文件中
json.load(file) :用于将磁盘文件中的数据反序列化到内存中,结果返回一个对象,需要用一个变量来接收

json.dumps(obj) :用于将一个对象序列化成一个字符串,并不保存到磁盘文件中,结果返回一个字符串对象,需要用变量来接收
json.loads() :用于将字符串反序列化成 python 对象

In [1]: import json

In [2]: data = {'name': 'Tom', 'age': 22}

In [3]: with open('1.json', 'w') as fd:    # 序列化
   ...:     json.dump(data, fd)
   ...:     

In [4]: with open('1.json', 'r') as fd:    # 反序列化
   ...:     data2 = json.load(fd)
   ...:     

In [5]: data2
Out[5]: {u'age': 22, u'name': u'Tom'}
In [1]: import json

In [2]: data = {'name': 'Tom', 'age': 22}

In [3]: data2 = json.dumps(data)    # 序列化

In [4]: type(data2)
Out[4]: str

In [5]: json.loads(data2)   # 反序列化
Out[5]: {u'age': 22, u'name': u'Tom'}

 

 

 

 

 

 

 

 

    

posted @ 2019-02-02 15:11  孔雀东南飞  阅读(507)  评论(0编辑  收藏  举报