23、常用模块二
一、json与pickle模块
1.1、什么是序列化和反序列化
内存中的数据类型====》序列化====》特定的格式(json格式或者pickle格式)
特定的格式(json格式或者pickle格式)====》反序列化====》内存中的数据类型
土办法:
{'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}" {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}"
1.2、为什么要序列化
序列化得到的结果====》特定的格式的内容有两种用途
1.用于存储====》可以存档
使用途径 :可以是一种专用的格式,pickle只能在python上识别
2.传输给其他平台====》用来跨平台数据交互
使用途径:应该是一种通用的格式,json是一种可以被所有语言识别的格式
1.3、怎么使用序列化和反序列化
1.3.1、序列化 json。dumps()
json_res=json.dumps([1,'aaa',True,False]) # print(json_res,type(json_res)) # "[1, "aaa", true, false]"
1.3.2、反序列化 json.loads()
l=json.loads(json_res) print(l,type(l))
二、configparser 模块
该模块适用于配置文件的格式与Windows ini文件相似,可以包含一个或者多个标题(section),每个节可以有多个参数(key=value)
import configparser config=configparser.ConfigParser() config.read('test.ini') # test。ini为python文件,里面的格式为节下面包含key=value
2.1、查看所有标题 config.sectiongs()
print(config.sections())
2.2、获取某个section下的所有内容 config.sectiongs(*)以列表形式
print(config.options('section1')) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
2.3、获取字典item config.items()
print(config.items('section1')) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
2.4、获取某个section下面,指定key对应value的值,并且以字符串的形式表示 config.get('section','key')
#查看标题section1下user的值=>字符串格式 val=config.get('section1','user') print(val) #egon
2.5、获取某个section下面,指定key对应value的值,并且以数字的形式表示 config.getint('section','key')
#查看标题section1下age的值=>整数格式 val1=config.getint('section1','age') print(val1) #18
2.6、获取某个section下面,指定key对应value的值,并且以布尔值的形式表示 config.getboolrean('section','key')
#查看标题section1下is_admin的值=>布尔值格式 val2=config.getboolean('section1','is_admin') print(val2) #True
2.7、获取某个section下面,指定key对应value的值,并且以浮点型的形式表示 config.getfloat('section','key')
#查看标题section1下salary的值=>浮点型格式 val3=config.getfloat('section1','salary') print(val3) #31.0
三、hashlib模块
3.1、什么是哈希hash
hash是是一种算法,该算法接收传入的值的内容,经过运算得到一串的hash值
hash的特点:
1.只要传入的值一致,得到的hash值也是一致的
2.得到的hash值不能返回成原值
3.不管传入的值有多大,只要hash算法不变,hash长度都是一致的
3.2、hash的用途
1.无法返回原值的特性可以作为密码密文的传输与验证
2.长度以及内用不变性,可以作为文件完整性的检验
3.3、hash怎么用
先设定hash的类型,在使用 变量.update(str.encode())进行添加, 最后变量.hexdigest生成hash值
import hashlib m=hashlib.md5() #md5是hash的类型 m.update('hello'.encode('utf-8')) #使用update添加 m.update('world'.encode('utf-8')) res=m.hexdigest() # 'helloworld' #生成hash值 print(res)
只要是同样的内容,最终会生成同样的hash值
m1=hashlib.md5('he'.encode('utf-8')) m1.update('llo'.encode('utf-8')) m1.update('w'.encode('utf-8')) m1.update('orld'.encode('utf-8')) res=m1.hexdigest()# 'helloworld' print(res)
3.4、模拟撞库
先知道一个hash值,设置一系列的密码,将密码生成hash值,通过对比hash值是否一致,得到密码
passwds=[ 'alex3714', 'alex1313', 'alex94139413', 'alex123456', '123456alex', 'a123lex', ] #先设定可能的密码 dic={} #设置空字典 for p in passwds: #循环 res=hashlib.md5(p.encode('utf-8')) #将可能的密码转换成hash值 dic[p]=res.hexdigest() # 存入字典中 # 模拟撞库得到密码 for k,v in dic.items(): if v == cryptograph: #找到的hash值 print('撞库成功,明文密码是:%s' %k) break
提升撞库的难度====》密码加盐
提高密码的复杂性
import hashlib m=hashlib.md5() m.update('天王'.encode('utf-8')) m.update('alex3714'.encode('utf-8')) m.update('盖地虎'.encode('utf-8')) print(m.hexdigest())
四、subprocess模块
调用操作系统的命令 subprocess。Popen
import subprocess 判断操作系统中是否存在该文件 obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True, stdout=subprocess.PIPE, #正确则执行 stderr=subprocess.PIPE, #错误则执行 ) print(obj) #<subprocess.Popen object at 0x00000168D72C0A90> res=obj.stdout.read() print(res.decode('utf-8')) #123 ; ls / ; ls /root err_res=obj.stderr.read() #该文件存在,则无输出 print(err_res.decode('utf-8'))