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