美文网首页
序列化模块之json和pickle

序列化模块之json和pickle

作者: MononokeHime | 来源:发表于2018-09-04 14:11 被阅读0次

    什么叫序列化?

    将原本的字典、列表或者类的实例对象等内容转换成一个字符串的过程就叫做序列化。

    为什么要序列化?

    1、以某种存储形式使对象(例如dict,object)持久化,例如存储到数据库中

    2、将对象从一个地方(网络)传递到另一个地方

    image.png

    用于序列化的两个模块:
    json,用于字符串 和 python数据类型间进行转换
    pickle,用于python特有的类型 和 python的数据类型间进行转换

    一.json

    首先明确一点:json本质上就是字符串

    • python对象->json使用json.dumps(python对象)
    • json->python对象使用json.loads(json字符串)
    • json字符串中的值必须用双引号,见下例

    在python中。只有基本的数据类型才能转换成json格式的字符串,也即:int,float,str,list,tuple,dict

    小技巧:如何记忆dumps和loads呢?我们mysql,redis经常使用到dumps来持久化,也就是将mysql里的数据已字符串或二进制的形式存储到硬盘,所以对应到json中的dumps,将抽象的数据内容(python对象)转成字符串。

    将python对象dumps成json字符串

    import json
    pesron = [{'user':'zs','age':10},
              {'user': 'ls', 'age':20}]
    x = 10
    y = {'user':'zs','age':10}
    json_str1 = json.dumps(pesron)
    json_str2 = json.dumps(x)
    json_str3 = json.dumps(y)
    print(type(json_str1),type(x),type(y))
    print(json_str1,json_str2,json_str3)
    

    输出

    <class 'str'> <class 'int'> <class 'dict'>
    [{"user": "zs", "age": 10}, {"user": "ls", "age": 20}] 10 {"user": "zs", "age": 10}
    
    

    如果我们要想把序列化的内容写到文件中,可以直接使用json.dump

    import json
    dic = {1:"a",2:"b"}
    f = open('myfile','w',encoding='utf-8')
    json.dump(dic,f)
    f.close()
    

    使用json.dumpsjson.dump的时候,只能存放ascii的字符,因此会将中文进行转义,这时候我们可以做使用ensure_ascii=False关闭这个特性。

    将json字符串loads成python对象

    import json
    #json_str = "[{'user':'zs','age':10},{'user': 'ls', 'age':20}]"  错误,必须用双引号
    json_str1 = """[{"user":"zs","age":10},{"user": "ls", "age":20}]"""
    json_str2 = """{"user":"zs","age":10}"""
    json_str3 = """12"""
    
    person = json.loads(json_str1)
    x = json.loads(json_str2)
    y = json.loads(json_str3)
    print(type(person),type(x),type(y))
    print(person,x,y)
    

    输出

    <class 'list'> <class 'dict'> <class 'int'>
    [{'user': 'zs', 'age': 10}, {'user': 'ls', 'age': 20}] {'user': 'zs', 'age': 10} 12
    

    二.pickle

    pickle可以序列化任意的数据类型,包括集合和类的对象实例

    import pickle
    
    class ABC:
        a = 10
    
        def __init__(self,m,n):
            self.m = m
            self.n = n
    
    abc = ABC(1,2)
    res = pickle.dumps(abc)
    back_res = pickle.loads(res)
    print(res)
    print(back_res)
    print(back_res.a)
    

    输出结果

    b'\x80\x03c__main__\nABC\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00mq\x03K\x01X\x01\x00\x00\x00nq\x04K\x02ub.'
    <__main__.ABC object at 0x10999fba8>
    10
    

    注意:将pickle.dumps的数据写到文件的时候,文件必须使用rb的模式打开后wb的模式写入

    相关文章

      网友评论

          本文标题:序列化模块之json和pickle

          本文链接:https://www.haomeiwen.com/subject/ooiwwftx.html