zoukankan      html  css  js  c++  java
  • 序列化与反序列化的三个模块:json pickle shelve

    # print('序列化模块')
    # """
    # # 什么是序列化?
    # # 将对象转化为字符串
    # # 什么是反序列化?
    # # 将字符串转化为对象
    # # 为什么要序列化?
    # # 数据的存储和传输都采用的是字符串类型,为了方便数据的传输与存贮
    # #
    # # 常用的序列化的模块:
    # # json pickle shevle
    # ##三种模块的比较与主要用途:
    # # json :支持跨语言,主要用于数据的传输
    # # pickle:支持python的所有数据类型,所以可以将所有python的对象序列化后存储
    # 主要用于数据的存贮
    # # shelve:支持python的所有数据类型,可以即时存与取,相当于在pickle的基础上优化了存取的方式
    #
    # ###序列化与反序列化的四种操作方式:
    # # 序列化:
    # # dump ( 这个功能更强一些)
    # # dumps
    # # 反序列化
    # # load ( 这个功能更强一些)
    # # loads
    # #
    # # 下面分开介绍着三个序列化模块
    # #
    # 一.json 模块(优势,用于传输,支持多语言,跨平台)
    # 什么是json?
    # 就是完成文本序列化得到文本字符串,json字符串具有一定的语法规范
    #
    # 1,支持的数据类型:int float str bool dict list null
    # 2,复杂的json数据都是由{}和[]嵌套形成的数据,也就是字典和列表嵌套形成
    # 3,json 字符串只能有一个根,不能有两个或者多个
    # 4,json中的str类型必须用双引号包裹,不支持单引号 三引号
    #
    import json
    ##python 对象,序列化然后变成了json字符串
    date = 123
    res1 = json.dumps(date)
    print(res1,type(res1))
    ##json字符串反序列化 得到python对象
    res2 = json.loads(res1)
    print(res2,type(res2))
    ####整型的123序列化之后得到json字符串形式的123,
    ##所有的对象经过序列化之后都会变成相应的字符串形式
    ##该字符串经过反序列化之后就会又得到原来的对象

    ###注意:
    '''
    在序列化的过程中,被序列化的对象,只能有一个,例如一个字典 一个字符串 一个列表 或者一个其他自定义的对象,
    但是不能有两个,不能同时将两个对象序列化,不管这两个对象的类型是相同还是不同
    这个被序列化的对象可以是嵌套的形式,字典套列表 列表再套字典,都是可以的,可以嵌套存在,对外表现还是一个,
    但是不能并行,也就是说只能有一个根
    '''
    json_str1 ="1.223" ##可以被序列化
    json_str2 ="false" ##可以被序列化
    json_str3 ="[]{}" ####不可以被序列化这种情况下有两个不同数据类型的根
    json_str4 ="[][]" ##不可以被序列化,这种情况下,只有一种数据类型,但是有两个,有两个根
    json_str5 ="[[],[]]" ###可以被序列化,这种情况下,只两个列表,被一个列表包起来,
    # 嵌套起来,变成一个大的列表,这种情况下就不会报错
    json_str6 = "123"
    obj1 = json.loads(json_str6)
    print(obj1,type(obj1))

    # # 操作文件

    # # #序列化
    import json
    #
    obj = {'name':'szp','age':24,'gender':'男'}
    with open('a.txt','w',encoding='utf-8') as wf:
    # json.dump(obj,wf)
    json.dump(obj,wf,ensure_ascii= False)
    ##有中文的时候,就将这个ensure_ascii的值修改成False,
    # 系统默认的编码是ASCII码,改成FALSE之后,这个默认的代码就会取消,
    ##采用和现在文本打开的编译一样的编码 也就是UTF-8编码,
    ##注意只有有中文的时候我们才需要这样设置,没有中文的时候可以不必设置

    # # ##反序列化
    with open('a.txt','r',encoding='utf-8') as rf:
    user_dic = json.load(rf)
    print(user_dic,type(user_dic))

    "注意:json模块的序列化与反序列化是一一对应关系"
    '''
    这个dump操作相当于将对象的信息写入文件进行存贮,
    load操作相当于将文件的信息进行读取,并且得到原来的对象
    如果我们直接将对象写入文件,不适用这些序列化与反序列化模块.
    由于文件必须是以文本字符串 或者二进制字符串的形式进行写入的
    这就会失去对象内部原来的数据结构数据形式,在重新读取的时候就需要对
    信息进行编码,对字符串进行拼接,构造,才能得到原来的对象,非常繁琐与麻烦,
    我们可以把序列化模块和反序列化模块理解成一种中间的协议
    对象====序列化====>字符串
    字符串===反序列化===>原来的对象
    所以在这里我们要学会使用这个序列化与反序列化的模块
    '''

    # 二.pickle模块:支持所有数据类型
    # 不能支持跨语言跨平台
    import pickle

    ##序列化
    obj = {'name':'szp','age':24,'gender':'男'}
    res = pickle.dumps(obj)
    print(res,type(res))

    print('================')
    ##反序列化
    print(pickle.loads(res),type(pickle.loads(res)))

    print('===========================================')
    ##文件操作:
    obj = {'name':'szp','age':24,'gender':'男'}
    ##将对象序列化写入文件
    with open('写入.txt',mode = 'wb') as wf:
    ###注意:这个地方的写入模式必须是wb模式,也就是二进制字符串写入
    ##y因为pickle 能序列化所有的数据类型,不仅仅是文本对象,还能是图片.音频 视频 都可以做到,
    ###所以只能用b字节模式进行操作
    pickle.dump(obj,wf)

    ####将文件反序列化得到原来的数据
    with open ('写入.txt',mode = 'rb') as rf:
    res = pickle.load(rf)
    print(res)

    # 三.shelve:
    # 支持所有的数据类型,即使存取
    # json 主要用于传输,pickle主要用于内部的存贮,
    # shelve 主要用于优化存取,存取更快.
    '''
    前面我们已经学习了两个序列化模块,一个是json 支持跨平台,跨语言,一般用来传输数据
    另一个设pickle 支持python的所有数据类型,一般用来做数据存贮,
    现在我们再学习第三个:shelve
    shelve可以优化存和取的方式

    '''
    import shelve
    she_tool = shelve.open('c.shv')

    ##序列化
    she_tool['name'] = 'owen'
    she_tool['info'] = {'name':'szp','age':24,'gender':'male'}
    ##反序列化
    res = she_tool['name']
    print(res)
    #结束时关闭文件
    she_tool.close()

    '''
    import shelve
    第一步:创建这个shelve文件
    she_tool = shelve.open('c.shv')
    第二步:序列化
    she_tool['info'] = {'name':'szp','age':24,'gender':'male'}
    第三部:反序列化
    print(she_tool['info'])
    第四步:结束时关闭文件
    she_tool.close()
    '''
    ##文件关闭了就不能再取到之前写入的数据了
    ##那么,如果我又想要当中的数据,可不可以二次打开,重新取数呢?

    ###二次操作:
    she_tool = shelve.open('c.shv')
    print(she_tool['info'])
    ##事实证明是可以二次操作的
    she_tool.close()

    ###这种序列化操作就十分强大了,比之前的json 和pickle 还要强大很多
    ##现在我序列化只需要几行代码了


    ##j简化版的:

    with shelve.open ('c.shv') as she_tool:
    ###序列化
    she_tool['name'] = 'szp'
    she_tool['age'] = 24
    ##反序列化
    print(she_tool['age'])
    print(she_tool['name'])
    print(she_tool['info'])

    print('===========================')
    ###注意看下面这两个代码执行结果的差异
    with shelve.open('c.shv',writeback=False) as she_tool:
    ##序列化将123 存进去
    she_tool['stus'] = [1,2,3]
    ##反序列化取出来
    print(she_tool['stus'])
    she_tool['stus'].append(4)
    print(she_tool['stus'])

    with shelve.open('c.shv',writeback= True) as she_tool:
    ##序列化将123 存进去
    she_tool['stus'] = [1,2,3]
    ##反序列化取出来
    print(she_tool['stus'])
    she_tool['stus'].append(4)
    print(she_tool['stus'])

    ### writeback 将反序列化到内存中的数据,操作后及时同步到文件中
    ###这个相当于多了一个数据更新的步骤, writeback 默认的值是 False
  • 相关阅读:
    java对象存储管理
    Linux下添加新硬盘,分区及挂载
    挂载磁盘
    安装JDK
    RESTful架构详解
    java的编程习惯影响程序性能
    spring boot中的约定优于配置
    java8新特性:interface中的static方法和default方法
    约定优于配置的概念与思考
    java的数据类型:基本数据类型和引用数据类型
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10885870.html
Copyright © 2011-2022 走看看