#在运行程序的过程中,所有变量都在内存中,我们把变量从内存中变成可存储或传输的过程称为序列化。我们可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新独到内存里称为反序列化。
#序列化是指将数据结构或对象转换成二进制串的过程。
#反序列化是指将序列化过程中生成的二进制串转换成数据结构或对象的过程。
#下面我们了解下Python中序列化或反序列化的方式。
1、一般序列化与反序列化
#Python的pickle模块实现了基本数据序列和反序列华。
#通过pickle模块的序列化操作,能够将程序中运行的对象信息保存到文件中,从而永久存储。
#通过pickle模块的反序列化操作,能够从文件中创建上一次程序保存的对象。
#pickle模块的基本接口如下:
1 pickle.dump(obj,file[,protocl])
#例如:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #pickle 4 5 import pickle 6 7 d=dict(name=‘xiao ming‘,num=1001) 8 print(pickle.dumps(d))
#pickle.dumps()方法把任意对象序列化成一个bytes,然后把这个bytes写入文件。也可以使用另一种方法pickle.dump(),直接把对象序列化后写入一个文件对象中,程序如下:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #pickle_dump 4 5 import pickle 6 d=dict(name=‘xiaoming‘,num=1001) 7 try: 8 f_name=open(‘dump.txt‘,‘wb‘) 9 pickle.dump(d,f_name) 10 finally: 11 f_name.close()
#打开dump.txt文件,可以看到里面是一堆看不懂的内容,这些都是Python保存的对象内部信息。
#既然已经将内容序列化到文件中了,使用文件时就需要把对象从磁盘读到内存。可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化对象;也可以直接用pickle.load()方法从一个文件对象中直接反序列化对象。从dump.txt文件中将序列化的内容反序列化的代码如下:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #pickle_load 4 5 import pickle 6 try: 7 f_name=open(‘dump.txt‘,‘rb‘) 8 print(‘load result:‘,pickle.load(f_name)) 9 finally: 10 f_name.close()
#执行结果如下:
1 D:\Pythonworkspace>python load.py 2 load result: {‘name‘: ‘xiaoming‘, ‘num‘: 1001}
#由执行结果看到,变量的内容被正确读取出来了。不过,虽然内容相同,但是对应的变量已经完全不同了。
#Pickle的序列化和反序列化只能用于Python,不同版本的Python可能彼此都不兼容,因此Pickle一般用于保存不重要的数据,也就是不能成功反序列化也没关系的数据。
2、JSON序列化与反序列化
#我们在上一节了解了pickle模块是Python中独有的序列化与反序列化模块,这节我们来了解的JSON方式是通用的。
#JSON(JavaScipt Object Notation)是一种轻量级的数据交换格式,是基于ECMAScript的一个子集。
#Python3中可以使用json模块对JSON数据进行编码解码,包含以下两个函数。
①json.dumps():对数据进行编码。
②json.loads():对数据进行解码。
#在JSON的编码解码过程中,Python的原始类型与JSON类型会相互转换,具体的转化对照如下表1和表2所示:
表1 Python编码为JSON类型
表2 JSON解码为Python类型
#下面是JSON序列化与反序列化的示例:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #JSON_Python 4 5 import json 6 7 data={‘num‘:1002,‘name‘:‘xiaoming‘} 8 json_str=json.dumps(data) 9 print(‘Python原始数据:‘,data) 10 print(‘JSON对象:‘,json_str)
#执行结果如下:
1 D:\Python\workspace\datatime\20180118>python JSON_Python.py 2 Python原始数据: {‘num‘: 1002, ‘name‘: ‘xiaoming‘} 3 JSON对象: {"num": 1002, "name": "xiaoming"}
#接着以上示例,我们可以将一个JSON编码的字符串转换为一个Python数据结构,代码如下:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #JSON_Python 4 5 import json 6 7 data={‘num‘:1002,‘name‘:‘xiaoming‘} 8 json_str=json.dumps(data) 9 print(‘Python原始数据:‘,data) 10 print(‘JSON对象:‘,json_str) 11 12 13 data2=json.loads(json_str) 14 print("data2[‘name‘]:",data2[‘name‘]) 15 print("data2[‘num‘]:",data2[‘num‘])
#执行结果如下:
1 D:\Python\workspace\datatime\20180118>python JSON_Python.py 2 Python原始数据: {‘num‘: 1002, ‘name‘: ‘xiaoming‘} 3 JSON对象: {"num": 1002, "name": "xiaoming"} 4 data2[‘name‘]: xiaoming 5 data2[‘num‘]: 1002
#如果要处理的是文件而不是字符串,就可以使用json.dump()和json.load()编码、解码JSON数据,进行如下处理:
#写入JSON数据
1 with open(‘dump.txt‘,‘w‘) as f: 2 json.dump(data,f)
#读取数据
1 with open(‘dump.txt‘,‘r‘) as f: 2 data=json.load(f)