zoukankan      html  css  js  c++  java
  • pickle json xml shelve configparser模块

    一 pickle

    pickle是一个用来序列化的模块

    序列化是什么?

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

    反序列化是什么?

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

    为什么要学序列化?

    就是为了将数据持久存储

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

    pickle模块主要功能

    dump   序列化

    load  反序列化

    dumps

    loads

    不带s得死帮你封装write read  更方便

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

    import pickle
    #用户注册后得到的数据
    name = '高跟‘’
    password = ‘123’
    height = 1.5
    hobby = ['吃‘,‘喝’,‘赌’,‘飘’,{1,2,3}】

    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))
    print(pickle.load(f))
    print(pickle.load(f))

    二 shelve模块

    shelve 模块  也用于序列化

    它于pickle 不同之处在于  不需要关心文件模式什么的 直接把它当成一个字典来看待

    它可以直接对数据进行修改  而不用覆盖原来的数据

    而pickle 你想要修改只能  用wb模式来覆盖

    import shelve
    use = {'name':'高根‘}
    s = shelve.open('userdb.shv')
    s['user'] = user
    s.close()
    
    s = shelve.open('userdb.shv',writeback=True)
    print(s['user'])
    s['user']['user'])
    s['user']['age']=20
    s.close()

     三 json模块(******)

      pickle 和 shevle 序列化后得到的数据 只有Python才能解析

      通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互

      我们必须保证这个数据 能够跨平台使用

      JSON是什么? jave script object notation 就是的对象表示法

      var obj = {"name":"egon")

      对于我们开发而言 json 就是一种通用的数据格式 任何语言都能解析

      js中的数据类型  Python数据类型

      {}        字典

      []        list

      string""      str""or''

      int/float      int/float

      true/false     True/False

      null         None

      json格式的语法规范  

      最外层通常是一个字典或者列表

      { }或[ ]

      只要你想写一个json格式的数据 那么最外层直接写()

      字符串必须是双引号

      可以再里面套任意多的层次

      json核心功能

      dump

      dumps

      load

      loads

      不带s 封装 write 和read

    import json
    
    # 反序列化
    # with open("a.json","rt",encoding="utf-8") as f:
    #     res = json.loads(f.read())
    #     print(type(res))
    
    # with open("a.json",encoding="utf-8") as f:
    #     print(json.load(f))
    
    
    # 直接解析字符串的json为python对象
    
    jsontext = """{
        "users": [{
                "name": "agon",
                "age": 68
            },
            {
                "name": "agon",
                "age": 68
            }
        ]
    }"""
    
    # res = json.loads(jsontext)
    # print(res)
    
    
    mydic = {
        "users": [{
            "name": "agon",
            "age": 68
        },
            {
                "name": "agon",
                "age": 68
            }
        ]
    }
    # with open("b.json","wt",encoding="utf-8") as f:
    #     f.write(json.dumps(mydic))
    
    # with open("b.json", "wt", encoding="utf-8") as f:
    #     json.dump(mydic, f)
    
    import json
    
    # dic = {"a": '理查德姑妈', "b": "找到你", "c": "看不见的客人"}
    # with open("c.json","wt",encoding="utf-8") as f:
    #     f.write(json.dumps(dic))
    # print(repr(s), type(s))
    
    # with open("c.json","rt",encoding="utf-8") as f:
    #     # print(f.read())
    #     d = json.loads(f.read())
    #     print(d)

    四 XML

    XML 可扩展的标记语言
    <></>
    也是一种通用的数据格式
    之所用用它也是因为跨平台

    学习的重点还是语法格式
    一、任何的起始标签都必须有⼀一个结束标签。
    <> </>
    二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
    签。这种语法是在⼤于符号之前紧跟一个斜线(/),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模块

      config parser

      用于解析配置文件的模块

      何为配置文件

      包含配置程序信息的文件就称为配置文件

      什么样的数据应作为配置信息

      需要改  但是不经常改的信息  例如数据文件的路径  DB_PATH

      

      配置文件中 只有两种内容

      一种是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)

    并在python中解析该文件 进行展示

    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"))
  • 相关阅读:
    反射
    ASP.NET
    解析命令行
    Private和Protected方法
    洗牌算法
    目标指向、Icon图标的错误
    数字签名与数字证书
    (Java实现) 最大团问题 部落卫队
    (Java实现) 最大团问题 部落卫队
    (Java实现)洛谷 P1164 小A点菜
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9807024.html
Copyright © 2011-2022 走看看