json与pickle模块

一、序列化和反序列化

1、什么是序列化&反序列化

内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式) 内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式)

2.为何要有序列化

序列化得到结果=>特定的格式的内容有两种用途

1、可用于存储=》用于存档 2、传输给其他平台使用=》跨平台数据交互

强调:
   针对用途1的特定一格式:可是一种专用的格式=》pickle只有python可以识别
    针对用途2的特定一格式:应该是一种通用、能够被所有语言识别的格式=》json

JSON和Python内置的数据类型对应如下:

1585646695701

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'x80x04x95x0fx00x00x00x00x00x00x00x8fx94(Kx01Kx02Kx03Kx04Kx05x90.' <class 'bytes'>

s = pickle.loads(res)
print(s, type(s)) # {1, 2, 3, 4, 5} <class 'set'>

原文地址:https://www.cnblogs.com/bailongcaptain/p/12608718.html