json和pickle模块

1、json和pickle模块

1.1 序列化

把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其余语言中也被称之为serialization,marshalling,flattening。python

序列化的优势:编程

  1. 持久保存状态:内存是没法永久保存数据的,当程序运行了一段时间,咱们断电或者重启程序,内存中关于这个程序的以前一段时间的数据(有结构)都被清空了。可是在断电或重启程序以前将程序当前内存中全部的数据都保存下来(保存到文件中),以便于下次程序执行可以从文件中载入以前的数据,而后继续执行,这就是序列化。
  2. 跨平台数据交互:序列化时不只能够把序列化后的内容写入磁盘,还能够经过网络传输到别的机器上,若是收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差别化带来的限制,实现了跨平台数据交互。

1.2 json

Json序列化并非python独有的,json序列化在java等语言中也会涉及到,所以使用json序列化可以达到跨平台传输数据的目的。json

json数据类型和python数据类型对应关系表网络

Json类型 Python类型
{} dict
[] list
"string" str
520.13 int或float
true/false True/False
null None

json模块序列化和反序列化的一个过程以下图所示编程语言

json模块

import json
struct_data = {'name': 'json', 'age': 23, 'sex': 'male'}
print(struct_data, type(struct_data))
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
data = json.dumps(struct_data)
print(data, type(data))
{"name": "json", "age": 23, "sex": "male"} <class 'str'>
# 注意:不管数据是怎样建立的,只要知足json格式(若是是字典,则字典内元素都是双引号),就能够json.loads出来,不必定非要dumps的数据才能loads
data = json.loads(data)
print(data, type(data))
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
# 序列化
with open('Json序列化对象.json', 'w') as fw:
    json.dump(struct_data, fw)
# 反序列化
with open('Json序列化对象.json') as fr:
    data = json.load(fr)
print(data)
{'name': 'json', 'age': 23, 'sex': 'male'}

1.3 pickle

Pickle序列化和全部其余编程语言特有的序列化问题同样,它只能用于Python,而且可能不一样版本的Python彼此都不兼容,所以,只能用Pickle保存那些不重要的数据,即不能成功地反序列化也不要紧。可是pickle的好处是能够存储Python中的全部的数据类型,包括对象,而json不能够。code

pickle模块序列化和反序列化的过程以下图所示对象

pickle模块

import pickle
struct_data = {'name': 'json', 'age': 23, 'sex': 'male'}
print(struct_data, type(struct_data))
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
data = pickle.dumps(struct_data)
print(data, type(data))
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00jsonq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x03\x00\x00\x00sexq\x04X\x04\x00\x00\x00maleq\x05u.' <class 'bytes'>
data = pickle.loads(data)
print(data, type(data))
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
# 序列化(注意:pickle模块须要使用二进制存储,即'wb'模式存储)
with open('Pickle序列化对象.pkl', 'wb') as fw:
    pickle.dump(struct_data, fw)
# 反序列化
with open('Pickle序列化对象.pkl', 'rb') as fr:
    pickle = pickle.load(fr)
print(data)
{'name': 'json', 'age': 23, 'sex': 'male'}
相关文章
相关标签/搜索