python的序列化和反序列化pickle和json

一、pickle模块
    1、pickle模块存储到变量:(二进制)
        (1)存,pickle.dumps(object):序列化为二进制
              将数据转为二进制(序列化)进行存储
    例子:
 

# 存储到变量中
dic = {"name": "张三", "psw": 123}
#将数据序列化为二进制
data = pickle.dumps(dic)
print(type(data),data)

         (2)取,pickle.loads(object):反序列化为原有数据
               将二进制数据转换成原有类型(反序列化)读出

#将二进制的数据反序列化为原来的数据
data2 = pickle.loads(data)
print(type(data2),data2)

    注意:dumps不具备写的功能,loads不具备读的功能。可以结合write()和read()将数据写入和读文件(似乎有问题)

    2、pickle模块存储到文件中:要以二进制open文件
        (1)写,pickle.dump(object,file)(二进制)
            以二进制的方式打开文件,并将数据存储到该文件

# #存储到文件中
path = r"C:\Users\Desktop\shop/serialize.txt"
#以二进制的形式将数据写入文件中
f = open(path,"wb")
pickle.dump(dic,f)
#关闭文件
f.close()

        (2)读,pickle.load(object,file)(原来是什么类型读出来的就是什么类型的数据)
            以二进制的方式打开文件,并将原数据读出来

#将path文件反序列化
f2 = open(path,"rb")
print(pickle.load(f2))
f2.close()

注意:dump具备写的功能,load具备读的功能。另外注意序列化几次就要反序列化几次

    3、将对象序列化到文件
         同上,将字典换成对象即可。相当于将存储对象的字典序列化后写入文件中(也就是序列化的还是字典),然后反序列化就是将该序列化的字典再反序列化为 

二、json模块
    1、json模块存储变量:
        (1)json.dumps(object):序列化为字符串

                存进去的是字符类型的数据(字符串的序列化,不绝对)

#存储到变量中
data3 = json.dumps(dic)
print(type(data3),data3)

        (2)json.loads(object):反序列化为原有数据
                读出的是原来类型的数据(字符串的反序列化)     

#读取
data4 = json.loads(data3)
print(type(data4),data4)

    2、json模块操作文件:
        (1)json.dump(object,file):序列化为字符串

                以字符的形式存进file文件中去(序列化)

#写,序列化为字符串
f3 = open(path2,"w")
json.dump(dic,f3)
f3.close()

        (2)json.load(object,file):反序列化为原有数据
                以字符的形式从file文件中读出来(反序列化为原来的数据) 

#读,反序列化为原有的类型
f4 = open(path2)
print(json.load(f4))
f4.close()

    3、json将对象序列化到文件

        (1)写,相当于将存储对象的字典序列化后写入文件中(也就是序列化的还是字典),然后反序列化就是将该序列化的字典再反序列化

  注意:这里的default应该是用了装饰器,default的值可以是函数名也可以是匿名函数

default=匿名函数:

file = open(path3,"w")
json.dump(p,file,default=lambda obj:obj.__dict__)
file.close()

defaul=普通函数:

def a(p):
    return {"name":p.name,"age":p.age}
file = open(path3,"w")
json.dump(p,file,default=a)
file.close()

    原理:通过json.dump(p,file,default=lambda obj:obj.__dict__)可以拿到对象p和default对应的函数地址以及文件file,然后将函数地址作为实参传递给装饰器,然后装饰器返回内部函数的地址,最后调用内部函数并将对象参数p和文件file传递进去实现对象p作为实参传递到装饰器内部函数,由内部函数实现普通函数的装饰,即:将普通函数中保存数据的字典序列化到文件中。

#将字典序列化到文件中
path = r"C:\Users\82739\Desktop\shop/serializeObj.txt"
default=lambda obj,path:print(obj.__dict__)
#装饰器
def dec(fun):
    #内部函数
    def inner(p,path):
        #匿名函数default()
        dic = fun(p,path)
       '''
       底部将字典写入到文件。。。。
       '''
    return inner#返回内部函数的地址
inner = dec(default)
inner(p,path)

        (2)读

file2 = open(path3,"r")
#这个函数是要自己写的
print(json.load(file2,object_hook="将反序列化的字典赋值给对象的字典的函数名(自己写)"))
file2.close()

装饰器:

    简单说就是在不改变原有方法的代码逻辑的情况下添加一些新的功能或需求 。规范的装饰器就是嵌套函数和回调函数结合实现的,能够处理参数传递问题。

#装饰器
def myFun(fun):
    #嵌套函数,内部函数
    def inner(sec):
        start = time.time()
        fun(sec)
        end = time.time()
        print("该代码执行用时:%f秒" %(end - start))
    return inner#内部函数的地址
#被装饰的函数
def fun(sec):
    time.sleep(sec)

inner = myFun(fun)#内部函数地址
inner(1)#调用内部函数,并传递参数

猜你喜欢

转载自blog.csdn.net/ryuhfxz/article/details/82973893