zoukankan      html  css  js  c++  java
  • 20,序列化模块 json,pickle,shelve

    序列化模块

    什么叫序列化?

    将原本的字典,列表等内容转换成一个字符串的过程叫做序列化。

    序列化的目的?

    数据结构 通过序列化 转成 str。

    str 通过反序列化 转化成数据结构。

    json:

    json模块提供了四个功能:dumps,dump,loads,load

    loads 和 dumps

    import json
    # dic = {'k1':'v1','k2':'v2','k3':'v3'}
    # str_dic = json.dumps(dic) ##注意,json转换完的字符串类型的字典中的字符串是由""表示的
    # # print([str_dic],type(str_dic))#用列表能看出来是不是字符串。
    # dict2 = json.loads(str_dic)##注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    # print(type(dict2),dict2)#<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    
    list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
    list1 = json.dumps(list_dic).strip()#也可以处理嵌套的数据类型
    print(type(list1),list1)#<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
    list2 = json.loads(list1)
    print(list2,type(list2))#[1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] <class 'list'>

    load 和 dump

    f = open('json_file','w')#打开一个文件,如果没有该文件自动创建文件
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串放入文件。
    f.close()#关闭文件句柄
    
    f = open('json_file')#打开文件
    dic2 = json.load(f)#通过json.load将文件中的内容取出来,直接将文件中的json字符串转换成数据结构
    f.close()#关闭文件句柄
    print(type(dic2),dic2)

    json格式化输出

    import json
    # json格式化输出
    data = {'username':['李华','二愣子'],'sex':'male','age':16}
    json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)

    json 和 pickle模块

    用于序列化的两个模块

      json:用于字符串和python数据类型之间的转换。

      pickle:用于python特有的类型 和python的数据类型间进行转换。

    pickle模块提供了四个功能:dumps,dump (序列化,存) loads(反序列化,读),load(不仅可以序列化字典,列表。。可以把python中任意的数据类型序列化)。

    # import pickle
    # dic = {'k1':'v1','k2':'v2','k3':'v3'}
    # str_dic = pickle.dumps(dic)#编译成一段bytes类型的数据
    # # print(str_dic)
    # 
    # dic2 = pickle.loads(str_dic)#解开bytes类型的字典。
    # print(dic2)

    import pickle
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = pickle.dumps(dic)
    print(str_dic) #一串二进制内容

    
    

    dic2 = pickle.loads(str_dic)
    print(dic2) #字典

    
    

    import time
    struct_time = time.localtime(1000000000)
    print(struct_time)
    f = open('pickle_file','wb')
    pickle.dump(struct_time,f)
    f.close()

    
    

    f = open('pickle_file','rb')
    struct_time2 = pickle.load(f)
    print(struct_time2.tm_year)

    
    

    pickle

     

    shelve

    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
    f.close()
    
    import shelve
    f1 = shelve.open('shelve_file')
    existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    f1.close()
    print(existing)
    
    shelve

    这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB

    import shelve
    f = shelve.open('shelve_file', flag='r')
    existing = f['key']
    f.close()
    print(existing)

    由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。

    import shelve
    f1 = shelve.open('shelve_file')
    print(f1['key'])
    f1['key']['new_value'] = 'this was not here before'
    f1.close()
    
    f2 = shelve.open('shelve_file', writeback=True)
    print(f2['key'])
    f2['key']['new_value'] = 'this was not here before'
    f2.close()

     writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入。

  • 相关阅读:
    java 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
    JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
    配置mabatis,报Could not load driverClass ${jdbc.driverClassName}
    maven-配置文件配置src/resource下的文件
    eclipse中tomcat 中server location灰色,如何修改?
    解决maven项目update project会更改jdk版本问题
    maven创建web工程Spring配置文件找不到问题解决方案
    maven:pom.xml中没有dependency标签错误
    [转载]如何让上传到新浪博客和相册中的照片更大更清晰
    [转载]如何让上传到新浪博客和相册中的照片更大更清晰
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9085306.html
Copyright © 2011-2022 走看看