json与pickle模块
一、序列化和反序列化
内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式) 内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式)
2.为何要有序列化
序列化得到结果=>特定的格式的内容有两种用途
1、可用于存储=》用于存档 2、传输给其他平台使用=》跨平台数据交互
强调:
针对用途1的特定一格式:可是一种专用的格式=》pickle只有python可以识别
针对用途2的特定一格式:应该是一种通用、能够被所有语言识别的格式=》json
JSON和Python内置的数据类型对应如下:
3.如何序列化和反序列化
序列化(json.dumps)
import json
json_res=json.dumps([1,'aaa',True,False])
print(json_res,type(json_res)) # "[1, "aaa", true, false]"
反序列化(json.loads)
l=json.loads(json_res)
print(l,type(l)) # [1, 'aaa', True, False] <class 'list'>
将序列化结果写入文件的快速方法(json.dump)
with open('test.json',mode='wt',encoding='utf-8') as f:
json.dump([1,'aaa',True,False],f)
将序列化结果从文件读出的快速方法(json.load)
with open('test.json',mode='rt',encoding='utf-8') as f:
l=json.load(f)
print(l,type(l)) # [1, 'aaa', True, False] <class 'list'>
注意点:
import json
dct="{'1':111}"#json 不认单引号
dct=str({"1":111})#报错,因为生成的数据还是单引号:{'one': 1}
dct='{"1":"111"}'
print(json.loads(dct))
# ps:无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads
loads的二进制形式(不适用于python3.5版本)
TypeError: the JSON object must be str, not 'bytes'
二、猴子补丁
猴子补丁的核心就是用自己的代码替换所用模块的源代码,详细地如下
1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。 2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。
1.功能
拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)
class Monkey:
def hello(self):
print('hello')
def world(self):
print('world')
def other_func():
print("from other_func")
monkey = Monkey()
monkey.hello = monkey.world
monkey.hello()
monkey.world = other_func
monkey.world()
2.应用场景
如果我们的程序中已经基于json模块编写了大量代码了,发现有一个模块ujson比它性能更高, 但用法一样
只需要在入口加上:
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json() # 之所以在入口处加,是因为模块在导入一次后,后续的导入便直接引用第一次的成果
三、pickle模块
import pickle
res = pickle.dumps({1, 2, 3, 4, 5})
print(res, type(res))
# b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K\x04K\x05\x90.' <class 'bytes'>
s = pickle.loads(res)
print(s, type(s)) # {1, 2, 3, 4, 5} <class 'set'>