zoukankan      html  css  js  c++  java
  • 常用内置模块(三)——shelve、xml、hashlib、configparser

    常用模块(三)

    一、shelve模块

    1、shelve模块也是一种序列化模块,内部使用的是pickle模块,所以也存在跨平台性差的问题

    2、特点:

       只要提供一个文件名即可

       读写的方式和字典一样

       将数据以类似字典的形式在文件中读写

    3、应用场景

      在单击的程序中使用

    4、使用方法

    (1)序列化

    1 import shelve
    2 
    3 s1= shelve.open('a.txt')      # 打开文件
    4 s1['week']=["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"]
    5 s1['person']={"name": "Zero", "age": 8, "height": 180}     # 写操作
    6 s1.close()     # 关闭文件

    (2)反序列化

    1 import shelve
    2 
    3 s2 = shelve.open('a.txt')     # 打开文件
    4 print(s2.get('week'))
    5 print(s2.get('person'))
    6 print(s2.get('person')['age'])    # 读取文件中内容
    7 s2.close()        # 关闭文件

    二、xml模块

    1、XML全称:可扩展标记语言,标记指的是代表某种含义的字符 XML<>

    2、为什么要用xml 

     (1)为能够在不同的平台间继续数据的交换
     (2)为了使交换的数据能让对方看懂,就需要按照一定的语法规范来书写

    3、语法格式

    (1)任何的起始标签都必须有一个结束标签。
      <tagname></tagname>
      <tagname></tagname>
      <tagname/> 简化写法

    (2)可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/)。

        例如<ABC/>:XML解析器会将其翻译成<ABC></ABC>。
    (3)标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不            能关闭外面的括号的。

    1 <tag1>
    2   <tag2>
    3     <tag3>
    4     </tag3>
    5   </tag2>
    6 </tag1> 

    (4)所有的特性都必须有值。
      特性指的是属性

    1 <person name="aaa">
    2 </person>

    (5)所有的特性都必须在值的周围加上双引号。

    4、注意点

    (1)最外层有且只有一个标签,这个标签为根标签
    (2)第一行应该有文档声明,用于高速计算机怎么理解
      例如:<?xml version="1.0" encoding="utf-8"?>

      

    1 <person>
    2     <sut1>
    3     </stu1>
    4     <sut2>
    5     </stu2>
    6 </person>
    标签嵌套

    5、使用场景:

    (1)配置文件
    (2)常规的数据交换。 例如从服务器获取一段新闻

    6、方法及属性

    (1).ElementTree 表示整个文件的元素树
    (2.)Element 表示一个节点
     a.属性
         text      开始标签和结束标签中间的文本
         attrib    所有的属性     字典类型
         tag       标签的名字
     b.方法
        get 获取某个属性的值
     1 import xml.etree.ElementTree as et
     2 
     3 # 读取xml文档到内存中  得到一个包含所有数据的节点树
     4 # 每一个标签就称之为一个节点 或 元素
     5 tree = et.parse("text.xml")
     6 
     7 # 获取根标签
     8 root = tree.getroot()
     9 
    10 # 获取所有的country   
    11 print(root.find("country"))   # 找的是第一个
    12 print(root.findall("country"))   # 找的是所有
    13 
    14 # 获取字标签
    15 print(root.iter("country"))
    16 for i in root.iter("country"):
    17     print(i)
    18 
    19 # 遍历整个xml
    20 for country in root:
    21      print(country.tag,country.attrib,country.text)
    22         for t in country:
    23               print(t.tag, t.attrib, t.text)
    24 
    25 print(root.find("country").get("name"))    
    遍历

    7、增删改查

    1.解析XML
        查找标签
        find      在子标签中获取名字匹配第一个
        findall   在子标签中获取名字匹配的所有标签
        iter(tagname)      在全文中查找[匹配的所有标签 返回一个迭代器
    
    2.生成XML
        用ElmentTree
        parse()  解析一个文件
        getroot() 获取根标签
        write()  写入到文件
    
    3.修改xml
        set 一个属性
        remove 一个标签
        append 一个标签
     1 # 读取到内存
     2 tree = et.parse("text.xml")
     3 for country in tree.findall("country"):
     4      yeartag = country.find("year")
     5      yeartag.text = str(int(yeartag.text) + 1)   修改标签文本
     6 
     7      country.remove(country.find("year"))     删除标签
     8 
     9     # 添加子标签
    10     newtag = et.Element("newTag")
    11     # 文本
    12     newtag.text = "123"
    13     #属性
    14     newtag.attrib["name"] = "DSB"
    15     #添加
    16     country.append(newtag)
    17 
    18 # 写回到内存
    19 tree.write("text.xml",encoding="utf-8",xml_declaration=False)
    增删改查

    8、生成xml文档

     1 import xml.etree.ElementTree as et
     2 # 创建根标签
     3 root = et.Element("root")
     4 # 创建节点树
     5 t1 = et.ElementTree(root)
     6 
     7 # 加一个peron标签
     8 persson = et.Element("person")
     9 persson.attrib["name"] = "yyh"
    10 persson.attrib["sex"] = "man"
    11 persson.attrib["age"] = "20"
    12 persson.text = "这是一个person标签"
    13 
    14 root.append(persson)
    15 
    16 # 写入文件
    17 t1.write("newXML.xml",encoding="utf-8",xml_declaration=True)
    生成

    三、hashlib模块

     1、hashlib分为hash和library

    (1)hash

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

    ②.特点

    a.输入数据不同,得到的hash值有可能相同
    b.不能通过hash值来得到输入的值
    c.如果算法相同,无论输入的数据长度是多少,得到的hash值长度相同

    ③.作用

    常用的提升安全性的手段,用于数据的加密,MD5是常用的一种hash算法

    (2)library

    2、利用hashlib加密

    1 import hashlib
    2 md = hashlib.md5()
    3 md.update("hello".encode("utf-8"))
    4 print(md.hexdigest())
    加密

    3、解密

    破解MD5可以尝试撞库  

    原理: 有一个数据库里面存放了常见的明文和密文的对应关系 

    四、configparser模块

    1、configparser模块是配置文件解析模块,用于提供程序运行所需要的一些信息的文件。 后缀 .ini,.cfg

    2、配置文件内容格式

      只包括两种元素:
        section    分区
        option     选项
      一个文件可以有多个section
      一个section可以有多个选项

    3、核心方法

    sections()     获取所有分区
    options()      获取所有选项
    get(section,option)            获取一个值

    4、配置文件

     1 import configparser
     2 
     3 # 得到配置文件对象
     4 cfg = configparser.ConfigParser()
     5 
     6 # 读取一个配置文件
     7 cfg.read("download.ini")
     8 
     9 print(cfg.sections())
    10 print(cfg.options("section1"))
    11 
    12 print((cfg.get("section1","maxspeed")))
    13 print((cfg.getint("section1","maxspeed")))
    14 print(cfg.getint("section2","minspeed"))
    15 
    16 
    17 # 修改最大速度为2048
    18 cfg.set("section1","maxspeed","2048")
    19 
    20 # 修改后写入文件
    21 cfg.write(open("download.ini","w",encoding="utf-8"))
    配置文件
  • 相关阅读:
    docker4dotnet #1 – 前世今生 & 世界你好
    DockerCon 2016 – 微软带来了什么?
    TFS 2015 敏捷开发实践 – 看板的使用
    几款Git GUI客户端工具
    (视频)Erich Gamma 与 Visual Studio Online 的一点野史
    GitHub + VSTS 开源代码双向同步
    UDAD 用户故事驱动的敏捷开发 – 演讲实录
    用户故事驱动的敏捷开发 – 2. 创建backlog
    算法 之 简单选择排序法
    算法 之 冒泡排序法
  • 原文地址:https://www.cnblogs.com/linagcheng/p/9469692.html
Copyright © 2011-2022 走看看