random随机数模块
import random
1.random()
print(random.random())
2.randint()
print(random.randint(1, 6))
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A', '大王', '小王']
3.choice()
print(random.choice(l1))
4.sample()
print(random.sample(l1, 3))
5.shuffle()
random.shuffle(l1)
print(l1)
练习:编写python代码 产生五位随机验证码(数字、小写字母、大写字母)
code = ''
for i in range(5):
random_int = str(random.randint(1,9))
ramdom_upper = chr(random.randint(65, 90))
ramdom_lower = chr(random.randint(97, 122))
choice = random.choice([random_int, ramdom_upper, ramdom_lower])
code += choice
print(code)
hashlib加密模块
1.什么是加密
将明文数据(看得懂)经过处理后变成密文数据(看不懂)的过程。
2.为什么要加密
不想让敏感的数据被轻易泄露
3.如何判断当前数据是否已被加密
一般情况下,一串没规则的数字和字母的组合一般都是加密之后的结果
4.加密算法
是指对明文采用的加密策略
不同的加密算法复杂度不一样,得出的结果也不一样。
通常情况下,加密后的结果越长说明算法越复杂。
5.常见的加密算法;
md5, sha系列, hmac, base64
6.代码实操
import hashlib
md5 = hashlib.md5()
md5.update(b'123')
res = md5.hexdigest()
print(res)
7.加密之后的结果一般不能反解密
所谓的反解密其实是偷换概念:提前假设别人的密码是什么,然后用各种算法算出对应的密文,之后构造对应关系,然后比对密文,最终映射出明文数据。
8.只要明文数据一样,那么采用相同算法加密过后的密文也一样。
md5 = hashlib.md5()
md5.update(b'aaabbbccc')
res = md5.hexdigest()
print(res)
9.加盐处理(给加密设置更多的干扰项)
password = input('password>>>').strip()
md5.update('我是干扰项'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest()
print(res)
10.动态加盐
干扰项每次都不一样(可以是当前时间,截取的一段用户名等等)
11.加密操作应用场景
1.用户密码加密
注册存储密文,登录比对密文
2.文件安全性校验
正规的软件程序写完之后做一个内容的加密,网址提供软件文件以及该文件内容对应的密文,用户下载完成后不直接运行 而是对下载的内容做加密,然后比对两次密文是否一致 如果一致表示文件没有被改,不一致则表示改程序有可能被植入病毒
3.大文件加密优化
eg:程序文件100G
一般情况下读取100G内容然后全部加密 太慢,不对100G所有的内容加密 而是截取一部分加密,比如:每隔500M读取30bytes
subprocess模块
模拟计算机cmd命令窗口
import subprocess
cmd = input('请输入您的指令>>>:').strip()
sub = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print(sub.stdout.read().decode('gbk'))
print(sub.stderr.read().decode('gbk'))
日志模块
日志模块介绍与使用
"""日志模块需要你写的代码很少 几乎都是CV"""
1.什么是日志
日志就类似于是历史记录
2.为什么要使用日志
为了记录事物发生的事实(史官)
3.如何使用日志
3.1.日志等级(由低到高分为五个等级)
import logging
logging.debug('debug等级')
logging.info('info等级')
logging.warning('warning等级')
logging.error('error等级')
logging.critical('critical等级')
3.2.基本使用
import logging
file_handler = logging.FileHandler(filename='log1.log', mode='a', encoding='utf8')
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler,],
level=logging.ERROR)
logging.error('我是error')
日志模块的组成部分
import logging
logger = logging.getLogger('购物车记录')
hd1 = logging.FileHandler('a1.log', encoding='utf-8')
hd2 = logging.FileHandler('a2.log', encoding='utf-8')
hd3 = logging.StreamHandler()
fm1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
fmt='%(asctime)s - %(name)s: %(message)s',
datefmt='%Y-%m-%d',
)
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
logger.setLevel(10)
logger.debug('写了半天 好累啊 好热啊')
"""
我们在记录日志的时候 不需要向上述一样全部自己写 过于繁琐
所以该模块提供了固定的配置字典直接调用即可
"""
日志配置字典
import logging
import logging.config
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
logfile_path = 'a3.log'
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': logfile_path,
'maxBytes': 1024*1024*5,
'backupCount': 5,
'encoding': 'utf-8',
},
},
'loggers': {
'': {
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': True,
},
},
}
logging.config.dictConfig(LOGGING_DIC)
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')