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没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入。

  • 相关阅读:
    python--模块与包
    内置函数 的总结
    迭代器 生成器 列表推导式 生成器表达式的一些总结
    函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数
    函数名的应用(第一对象) 闭包 装饰器
    动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
    函数的初识 函数的返回值 参数
    文件操作 常用操作方法 文件的修改
    遍历字典的集中方法 集合的作用 以及增删查的方法
    计算机硬件的小知识
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9085306.html
Copyright © 2011-2022 走看看