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