常用模块(二)

一. configparser  模块


configparser  模块指的是 配置文件解析模块

其中配置文件指的是  用于提供程序运行所需要的一些信息的文件

作用是  方便用户修改程序内的一些数据   例如超时时间


配置文件内容格式 : 只包括两种元素

section  分区

option  选项

一个文件可以有多个section,一个section可以有多个option(选项)


核心功能

1.sections  获取所有分区

2.options   获取所有选项

3.get          获取一个值         传入  section   option

注意点:   其中大小写不敏感

代码示例:

# 假装做一个下载功能 最大链接速度可以由用户来控制 用户不会看代码 所以提供一个配置文件  

download.ini  部分代码

[section1]

# 这是最大下载速度

maxspeed =2048

[section2]

minspeed =100


import configparser

# 得到配置文件对象    

cfg  =  configparset.ConfigParser()

# 读取一个配置文件    

cfg.read("download.ini")

# 修改最大速度为2048

cfg.set("section1","maxspeed","2048")

cfg.write(open("download.ini","w",encoding="utf-8"))


二. 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 iin 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())


三.shelve模块


什么是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()


4. xml模块


XML

什么XML:全称 可扩展标记语言

标记指的是代表某种含义的字符 XML<>

为什么需要XML

为能够在不同的平台间继续数据的交换

为了使交换的数据能让对方看懂 就需要按照一定的语法规范来书写

XML语法格式:

一、任何的起始标签都必须有一个结束标签。

  简化写法

二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条>。

三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。

    大白话  关闭标签应该从内往外 一层一层关闭 顺序不能乱

四、所有的特性都必须有值。

特性指的是属性

五、所有的特性都必须在值的周围加上双引号。

注意:最外层有且只有一个标签 这个标签称之为根标签

第一行应该有文档声明 用于高速计算机怎么理解

例如:

当标签嵌套的时候会出现层级关系  如果一个标签不被任何别的标签包裹 那他就是根标签(最外层)

使用场景:

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.ElementTreeas 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 countryin 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)

=================================================================

"""

用代码生成一个xml文档

"""

import xml.etree.ElementTreeas et

# 创建根标签

root= et.Element("root")

# 创建节点树

t1= et.ElementTree(root)

# 加一个peron标签

persson= et.Element("person")

persson.attrib["name"] = "yyh"

persson.attrib["sex"] = "man"

persson.attrib["age"] = "20"

persson.text= "这是一个person标签"

root.append(persson)

# 写入文件

t1.write("newXML.xml",encoding="utf-8",xml_declaration=True)

你可能感兴趣的:(常用模块(二))