zoukankan      html  css  js  c++  java
  • 常用模块xml,shelve,configparser,hashlib

    XML
    什么XML:全称 可扩展标记语言
    标记指的是代表某种含义的字符 XML<>
    为什么需要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的数据比xml小
    目前json是主流

    python中的xml处理
    使用到的模块
    ElmentTree 表示整个文件的元素树

    Elment 表示一个节点
    属性
    1.text 开始标签和结束标签中间的文本
    2.attrib 所有的属性 字典类型
    3.tag 标签的名字
    方法
    get 获取某个属性的值
    1.解析XML
    查找标签
    find 在子标签中获取名字匹配第一个
    findall 在子标签中获取名字匹配的所有标签
    iter(tagname) 在全文中查找[匹配的所有标签 返回一个迭代器
    2.生成XML
    用ElmentTree
    parse() 解析一个文件
    getroot() 获取根标签
    write() 写入到文件
    3.修改xml
    set 一个属性
    remove 一个标签
    append 一个标签

    # 语法格式练习: 要求把你的同桌的手机信息用xml来描述
    """
    import xml.etree.ElementTree as et

    # 读取xml文档到内存中 得到一个包含所有数据的节点树
    # 每一个标签就称之为一个节点 或 元素
    # tree = et.parse("text.xml")
    # # 获取根标签
    # root = tree.getroot()
    # # 获取所有的country 找的是第一个
    # print(root.find("country"))
    # # 找的是所有
    # print(root.findall("country"))
    #
    # # 获取year
    # print(root.iter("country"))
    # for i in root.iter("country"):
    # print(i)
    #
    #
    # # 遍历整个xml
    # for country in root:
    # print(country.tag,country.attrib,country.text)
    # for t in country:
    # print(t.tag, t.attrib, t.text)
    #
    #
    #
    # 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)

    """
    什么是shelve模块
    也是一种序列化方式
    使用方法
    1.opne
    2.读写
    3.close
    特点:使用方法比较简单 提供一个文件名字就可以开始读写
    读写的方法和字典一致
    你可以把它当成带有自动序列化功能的字典
    原理: 内部使用的就是pickle 所以 也存在跨平台性差的问题 你自己存的只有你自己知道怎么取

    什么时候用:写一个单机程序时可以考虑

    """
    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()

    """

    hashlib
    hash是什么?
    是一种算法
    用于将任意长度的数据,压缩映射到一段固定长度的字符 (提取特征)


    hash的特点:
    1.输入数据不同,得到的hash值有可能相同
    2.不能通过hash值来得到输入的值
    3.如果算法相同,无论输入的数据长度是多少,得到的hash值长度相同

    因为以上特点常将hash算法用于加密和文件校验
    输入用户名和密码 在代码中与数据库中的判断是否相同
    思考当你的数据需要在网络中传递时 就可能会受到网络攻击
    黑客通过抓包工具就能截获你发送和接收的数据
    所以你的数据 如果涉及到隐私 就应该先加密在发送

    加密的方式有很多
    常用的MD5就是一种hash算法


    常用的提升安全性的手段 就是加盐
    就是把你加密前的数据做一些改动 例如 把顺序反过来

    library

    """
    import hashlib
    md = hashlib.md5()
    md.update("hello你这么牛逼吗 你破解我试试? DSB".encode("utf-8"))
    print(md.hexdigest())


    # 破解MD5可以尝试撞库 原理: 有一个数据库 里面存放了常见的明文和密文的对应关系 ,
    # 所以我可以拿着一个密文取数据库中查找 有没有已经存在的明文 如果有撞库成功 能不能破解凭运气
    # 假设我已经拿到了一个众多账号中的一个密码 我可以那这个密码 挨个测试你的所有账号 可能不能碰到运气
    pwd_dic = {"123456":"e10adc3949ba59abbe56e057f20f883e","hello":"5d41402abc4b2a76b9719d911017c592"}

    for i in pwd_dic:
    if pwd_dic[i] == "5d41402abc4b2a76b9719d911017c592":
    print(i)
    ''

    # 今后我们在写一些需要网络传输的程序时 如果要进行加密 最好把加密的算法搞得更复杂
    # 密码长度为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())


    # 加密实际上能做的就是让黑客的的破解成本大于他的利润


    #
    # sha = hashlib.sha512()
    # sha.update("abcd".encode("utf-8"))
    # print(len(sha.hexdigest()))
    #

    import hmac
    h = hmac.new("121212".encode("utf-8"))
    h.update("abcd".encode("utf-8"))
    print(h.hexdigest())

    """
    configparser 是什么? 配置文件解析模块
    什么是配置文件?
    用于提供程序运行所需要的一些信息的文件 后缀 ini cfg
    有什么用?
    方便用户修改 例如超时时间

    配置文件内容格式
    只包括两种元素
    section 分区
    option 选项
    一个文件可以有多个section
    一个section可以有多个选项

    核心功能
    1.sections 获取所有分区
    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"))

  • 相关阅读:
    Autofac +webapi 配置
    net 记录controller Action耗时
    C# ASP.NET Core使用HttpClient的同步和异步请求
    C#实体对象序列化成Json,格式化,并让字段的首字母小写
    Razor 将C#对象转换成Javascript对象, json还原被转码的字符 &quot·· HTML转义符
    js 递归树结构数据查找父级
    api下载文件
    Ubuntu django+nginx 搭建python web服务器文件日志
    python scrapy cookies 处理
    ubuntu 环境下pycharm的 安装与激活教程 以及错误解决方法
  • 原文地址:https://www.cnblogs.com/fushaunglin/p/9470625.html
Copyright © 2011-2022 走看看