zoukankan      html  css  js  c++  java
  • python学习的第21天模块之pickle、json、xml、shelve、configparser

    一、pickle  ***

    1、作用;专门用于python语言的序列化

    PS;(1)什么是序列化?

                   指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上

          (2)什么是反序列化?

                   将硬盘上存储的中间格式数据在还原为内存中的数据结构

          (3)为什么要序列化?

                   为了将数据持久存储,之前学过的文件也能完成持久化储存,但是操作起来非常麻烦

    Pickle模块主要功能:dump、load、dunmps、loads

    dump是序列化,load是反序列化

    注意:

    dump和dumps、load和loads的区别:不带s 是帮你封装write和read更方便

    load函数可以多次执行  每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input

    先创建一个文件,用户注册后得到的数据

    name = "高跟"
    password = "123"
    height = 1.5
    hobby = ["","","","",{1,2,3}]
    
    
    # with open("userdb.txt","wt",encoding="utf-8") as f:
    #     text = "|".join([name,password,str(height)])
    #     f.write(text)
     pickle支持python中所有的数据类型
    user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}
     序列化的过程
    # with open("userdb.pkl","ab") as f:
    #     userbytes = pickle.dumps(user)
    #     f.write(userbytes)
    # 反序列化过程
    # with open("userdb.pkl","rb") as f:
    #     userbytes = f.read()
    #     user = pickle.loads(userbytes)
    #     print(user)
    #     print(type(user))
    #dump 直接序列化到文件
    # with open("userdb.pkl","ab") as f:
    #     pickle.dump(user,f)
    
    # #load 从文件反序列化
    with open("userdb.pkl","rb") as f:
        user = pickle.load(f)
        print(user)
        print(pickle.load(f))
    #dump 直接序列化到文件
    # with open("userdb.pkl","ab") as f:
    #     pickle.dump(user,f)
    
    # #load 从文件反序列化
    with open("userdb.pkl","rb") as f:
        user = pickle.load(f)
        print(user)
        print(pickle.load(f))

    二、shelve

    1、作用:极其简单的序列化模块,只用于python

    优点:shelve模块 也用于序列化,它于pickle不同之处在于 不需要关心文件模式什么的 直接把它当成一个字典来看待,
    它可以直接对数据进行修改 而不用覆盖原来的数据,而pickle 你想要修改只能 用wb模式来覆盖

    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型

    import shelve
    # user = {"name":"高根"}
    # s = shelve.open("userdb.shv")
    # s["user"] = user
    # s.close()


    s = shelve.open("userdb.shv",writeback=True)
    print(s["user"])
    s["user"]["age"] = 20
    s.close()

    三、json   *****

    1、作用是一种跨平台的数据格式    也属于序列化的一种方式

    2、为什么用:

    pickle 和 shevle 序列化后得到的数据 只有python才能解析
    通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互
    我们必须保证这个数据 能够跨平台使用

        js 中的数据类型  python数据类型 的对应关系
        {}              字典
        []              list
        string ""       str
        int/float       int/float
        true/false      True/False
        null            None

    3、怎么用:

    json格式的语法规范
    最外层通常是一个字典或列表{} or []
    只要你想写一个json格式的数据 那么最外层直接写{},且字符串必须是双引号
    你可以在里面套任意多的层次

    对于我们开发而言 json就是一种通用的数据格式 任何语言都能解析
    json存储数据取必须都是python数据结构 js 中的数据类型 python数据类型 的对应关系 {} 字典 [] list
    string "" str int/float int/float true/false True/False null None

    json模块的核心功能
    dump、dumps、load、loads        不带s 封装write 和 read

    (1)json的序列化

    import json
    
    dic={'name':'egon','age':18,'sex':'male'}
    #序列化:内存中的数据类型------>中间格式json
    
    # # 1、序列化得到json_str
    # json_str=json.dumps(dic)
    # # 2、把json_str写入文件
    # with open('db.json','wt',encoding='utf-8') as f:
    #     f.write(json_str)
    
    #1和2合为一步
    with open('db.json','wt',encoding='utf-8') as f:
        json.dump(dic,f)
    
    
    # print(json_str,type(json_str)) # json格式不能识别单引号,全都是双引号

    (2)json的反序列化

    import json
    
    #反序列化:中间格式json-----》内存中的数据类型
    
    # #1、从文件中读取json_str
    # with open('db.json','rt',encoding='utf-8') as f:
    #     json_str=f.read()
    # #2、将json_str转成内存中的数据类型
    # dic=json.loads(json_str)
    
    #1和2可以合作一步
    with open('db.json','rt',encoding='utf-8') as f:
        dic=json.load(f)
    
    print(dic['sex'])

    四、xml

    1、作用:可扩展标记语言,一种编写文档的语法 也支持跨平台,比较json而言 属于重量级(不实用)

    import xml.etree.ElementTree as ET
    
    tree = ET.parse("a.xml")
    root = tree.getroot()

    学习的重点还是语法格式
    (一)、任何的起始标签都必须有⼀一个结束标签。
    <> </>
    (二)、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
    签。这种语法是在⼤于符号之前紧跟一个斜线(/),XML
    解析器会将其翻译成<百度百科词条></百度百科词条>。
    例例如<百度百科词条/>。

    (三)、标签必须按合适的顺序进⾏行行嵌套,所以结束标签必须按镜像顺序匹配
    起始标签。这好⽐比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有
    的内部括号之前,是不不能关闭外⾯面的括号的。
    (四)、所有的特性都必须有值。
    (五)、所有的特性都必须在值的周围加上双引号。

        一个标签的组成部分
        <tagename 属性名称="属性值">文本内容
        </tagname>
    
        单标签的写法
        <tagename 属性名称="属性值"/>
    
        # 镜像关闭顺序实例
        <a>
            <b>
                <c>
                </c>
            </b>
        </a>
    把你左右同学的信息写成xml
    <studentinfo>
        <张三>
            <age>20</age>
            <gender>man</gender>
        </张三>
        <李四>
            <age>20</age>
            <gender>man</gender>
        </李四>
    </studentinfo>
    
        总结 xml也是一种中间格式 也属于序列化方式之一
        与json相比较
        同样的数据  json会比xml 更小 效率更高
        xml 需要根据文档结构 手动解析 而json 直接转对象
    import xml.etree.ElementTree as ElementTree
    # 解析d.xml
    tree = ElementTree.parse("d.xml")
    print(tree)
    # 获取根标签
    rootTree = tree.getroot()
    
    # 三种获取标签的方式
    # 获取所有人的年龄 iter是用于在全文范围获取标签
    # for item in rootTree.iter("age"):
    #     # 一个标签三个组成部分
    #     print(item.tag) # 标签名称
    #     print(item.attrib) # 标签的属性
    #     print(item.text) # 文本内容
    
    # 第二种 从当前标签的子标签中找到一个名称为age的标签  如果有多个 找到的是第一个
    # print(rootTree.find("age").attrib)
    # 第三种 从当前标签的子标签中找到所有名称为age的标签
    # print(rootTree.findall("age"))
    # 获取单个属性
    stu = rootTree.find("stu")
    print(stu.get("age"))
    print(stu.get("name"))
    
    # 删除子标签
    rootTree.remove(stu)
    
    
    # 添加子标签
    # 要先创建一个子标签
    newTag = ElementTree.Element("这是新标签",{"一个属性":""})
    rootTree.append(newTag)
    
    # 写入文件
    tree.write("f.xml",encoding="utf-8")

    五、configparser   *****

    1、作用:用于解析配置文件的模块

    何为配置文件:包含配置程序信息的文件就称为配置文件
    什么样的数据应作为配置信息:需要改 但是不经常改的信息 例如数据文件的路径 DB_PATH

    2、用法:

    配置文件中 只有两种内容
    一种是section 分区
    一种是option 选项 就是一个key=value形式

    我们用的最多的就是get功能 用来从配置文件获取一个配置选项

    import configparser
    # 创建一个解析器
    config = configparser.ConfigParser()
    # 读取并解析test.cfg
    config.read("test.cfg",encoding="utf-8")
    # 获取需要的信息
    # 获取所有分区
    # print(config.sections())
    # 获取所有选项
    # print(config.options("user"))
    # 获取某个选项的值
    # print(config.get("path","DB_PATH"))
    # print(type(config.get("user","age")))
    #
    # # get返回的都是字符串类型  如果需要转换类型 直接使用get+对应的类型(bool int float)
    # print(type(config.getint("user","age")))
    # print(type(config.get("user","age")))
     是否由某个选项
    config.has_option()
    # 是否由某个分区
    # config.has_section()
    
    # 不太常用的
    # 添加
    # config.add_section("server")
    # config.set("server","url","192.168.1.2")
    # 删除
    # config.remove_option("user","age")
    # 修改
    # config.set("server","url","192.168.1.2")
    
    # 写回文件中
    # with open("test.cfg", "wt", encoding="utf-8") as f:
    #     config.write(f)
  • 相关阅读:
    【C#】工具类-FTP操作封装类FTPHelper
    网盘搜索网站
    在线服务
    Windows下安装NTP服务器
    vue 组件间的传值 + 路由守卫
    功能6 -- 选项卡数据缓存
    vue2.0/3.0
    vuex
    mySql笔记
    Typescript
  • 原文地址:https://www.cnblogs.com/ye-hui/p/9807229.html
Copyright © 2011-2022 走看看