• day 18


    1. xml 模块

    """"
    xml:
        什么是xml:可扩展标记语言
        标记:代表某种含义的字符  mxl<>
        为什么需要XML:
            为了在不同的平台间进行数据的交换
            为了使交换的数据呢能够让对方看懂,需要按照一定的语法规范开书写
        xml语法格式:
            一、任何的起始标签都必须有一个结束标签。
                <tagname></tagname>
                <tagname></tagname>
                <tagname/>  简化写法
    
            二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条></百度百科词条>。
            三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
                <tag1>
                    <tag2>
                        <tag3>
                        </tag3>
                    </tag2>
                </tag1>    大白话  关闭标签应该从内往外 一层一层关闭 顺序不能乱
            四、所有的特性都必须有值。
                特性指的是属性
                <person name="">
                </person>
            五、所有的特性都必须在值的周围加上双引号。
            注意:
                最外层有且只有一个标签,这个标签称之为根标签
                第一行应该有文档声明,用于告诉计算机怎么理解
                例如: 例如:<?xml version="1.0" encoding="utf-8"?>
                当标签嵌套的时候会出现层级关系,如果一个标签不被任何一个标签包裹,那么他就是跟标签(最外层)
            使用场景:
                1.配置文件
                2.常规的数据交换 例如从服务器到获取一段新闻
                与json的区别:
                    作用是一样的 都是一种数据格式
                    xml 比json 先诞生
                    目前的主流是json
                Python中的xml处理:
                    使用到的模块:
                    ElemtTree 表示一个整个文件的元素树
                    Elment 表示一个节点
                    属性
                    1.text 开始标签可结束标签中间的文本
                    2.attrib 所有的属性, 字典类型
                    3.tag 标签的名字
                     get 获得某个属性的值
                1. 解析XMl:
                    查找标签:
                    find 在字标签中获得名字  匹配第一个
                    findall 在子标签中获取名字 匹配所有的标签
                    iter   在全文中查找匹配的所有标签 返回一个迭代器
                2.生成xml
                    用ElmentTree
                    parse()   解析一个文件
                    getroot() 获取跟标签
                    writer() 写入文件
                3.修改xml
                    set 一个属性
                    remove 一个标签
                    append 一个标签
    
    """
    import xml.etree.ElementTree as et
    tree=et.parse("text")
    #获取根标签:
    root=tree.getroot()
    #获取所有的county  找到的是第一个
    # print(root.find("country"))
    #获取所有的country
    # print(root.findall("country"))
    
    
    # print(root.iter("country"))
    # for i  in root.iter("country"):
    #     print(i)
    
    print(root.find("country").get("name"))
    
    # =============================================修改  第所有的country的year文本  改成加1
    # 读取到内存
    tree = et.parse("text.xml")
    for country in tree.findall("country"):
        # yeartag = country.find("year")
        # yeartag.text = str(int(yeartag.text) + 1)   修改标签文本
    
        # country.remove(country.find("year"))     删除标签
    
        # 添加子标签
        newtag = et.Element("newTag")
        # 文本
        newtag.text = "123"
        #属性
        newtag.attrib["name"] = "DSB"
        #添加
        country.append(newtag)
    
    # 写回到内存
    tree.write("text.xml",encoding="utf-8",xml_declaration=False)

    2.shelve 模块

    """
    1.什么是shelve模块: 也是一种序列化方式
        使用方式:
            1.open
            2.读写
            3.close
        特点:使用方法比较简单,提供一个文件名字就可以开始读写
        读写的方法和字典一致(可以把它当成自动序列化功能的字典)
        原理:内部使用的是pick 所以 也跨平台性差 自己存的也只有自己知道
        什么时候使用:  写一个单机程序时可以考虑
        用get 得到字典的values 的值
    import shelve
    # 序列化
    # sl = shelve.open("shelvetest.txt")
    # sl["date"] = "8-13"
    # sl["list1"] = ["123","456"]
    # sl.close()
    
    
    # 反序列化
    s2 = shelve.open("shelvetest.txt")
    print(s2.get("list1"))
    s2.close()
    
    """

    3.hashlib 模块

    """"
    1. hashlib :
        是一种算法,用于将任意的数据,压缩映射到一段笃定长度的字符
    
        特点:
            1.输入的数据不同,得到的hashlib的值有可能相同
            2.不能通过hash值,得到输入的值
            3.如果算法相同,无论输入的数据长度数多少,得到的hash值长度相同
    
            用途:
                1.用于文件的加密和检验
    2. 加密的方法:常用的MD5就是一种hash算法
    # 破解MD5可以尝试撞库   原理: 有一个数据库 里面存放了常见的明文和密文的对应关系 ,
    # 所以我可以拿着一个密文取数据库中查找 有没有已经存在的明文  如果有撞库成功  能不能破解凭运气
    # 假设我已经拿到了一个众多账号中的一个密码  我可以那这个密码 挨个测试你的所有账号  可能不能碰到运气
    
    3.常用的手段就是"加盐" ;就是把你加密的数据在加密前做一些改动,例如将顺序颠倒
    
    """
    #hash 加密的步骤
    import hashlib
    # md = hashlib.md5()
    # md.update("hello你这么牛逼吗 你破解我试试? DSB".encode("utf-8"))
    # print(md.hexdigest())
    
    
    # 今后我们在写一些需要网络传输的程序时 如果要进行加密  最好把加密的算法搞得更复杂
    # 密码长度为6位
    # abcdef
    # 在前面加一个  abc  在后面加一个 cba 完事以后在加密
    pwd = "abcdef"
    
    # pwd = "abc"+pwd+"cba"
    
    md2 = hashlib.md5()
    # md2.update("121".encode("utf-8"))
    md2.update(pwd.encode("utf-8"))
    # md2.update("akjasjkasa".encode("utf-8"))
    print(md2.hexdigest())

    4.configparse 模块

    """
    configparser:配置文件解析模块
    什么是配置文件:用于提供一些程序运行所需的一些信息文件 后缀ini cfg
    用途:
     方便用户修改 例如超时时间
     配置文件的内容包含(两个元素):
        section 分区
        option 选项
        一个文件可以有多个section
        一个section可以多个选项
    
    
    核心功能:
        1.section 获取所有分区
        2.options 获取所有的选项
        3.get 获取有个值  传入 section option
        注意: 大小写不敏感
    # 假装做一个下载功能 最大链接速度可以由用户来控制  用户不会看代码 所以提供一个配置文件
    文件
    import configparser
    # 得到配置文件对象
    cfg = configparser.ConfigParser()
    # 读取一个配置文件
    cfg.read("download.ini")
    
    print(cfg.sections())
    print(cfg.options("section1"))
    
    print(type(cfg.get("section1","maxspeed")))
    print(type(cfg.getint("section1","maxspeed")))
    print(cfg.getint("section2","minspeed"))
    
    
    # 修改最大速度为2048
    cfg.set("section1","maxspeed","2048")
    
    cfg.write(open("download.ini","w",encoding="utf-8"))
    
    """
  • 相关阅读:
    Vue3源码系列之触发更新的实现
    Vue3源码系列之依赖收集的实现
    Vue3源码系列之reactiveApi实现
    删除链表的倒数第n个节点
    Shared_ptr 参考实现
    linux 目录结构 比较老
    C++11 bind function
    状态机DP
    尾递归
    秒杀系统的构建(2)
  • 原文地址:https://www.cnblogs.com/jxl123/p/9469427.html
Copyright © 2020-2023  润新知