random随机数模块、hashlib加密模块和logging日志模块

openpyxl模块读取数据

from openpyxl import load_workbook
wb = load_workbook(r'110.xlsx', data_only=True)  #
print(wb.sheetnames)  # 将文件的工作簿组成列表输出
# ['Sheet', '闪电家族']
wb1 = wb['闪电家族']  # 选择工作牌的名字或索引取值
print(wb1.max_row)  # 工作簿有多少行
# 5
print(wb1.max_column)  # 工作簿有多少列
# 4
print(wb1['A3'].value)  # 将工作簿第2行3列输出
# barry
print(wb1.cell(row=2, column=3).value)  # 将工作簿第2行3列输出
# 20
for i in wb1.columns:
    print([j.value for j in i])  # 将工作簿按列组成列表输出
# ['name', 'jay', 'barry', 'wally', 'bart']
# ['pwd', '123', '123', '123', '123']
# ['age', '20', '20', '20', '20']
# ['hobby', 'run', 'run', 'run', 'run']

"""
openpyxl读取数据比较麻烦,有一些模块优化了读取方法
如:pandas模块
"""

random随机数模块

  • random模块的使用
import random

print(random.random())  # 随机返回0到1之间的任意小数
# 0.006087422886232985
print(random.randint(1, 6))  # 随机返回1到6之间的任意整数
# 6
print(random.choice(['老魔杖', '无限宝石', '贤者之石', '神速力', '万花筒写轮眼']))  # 随机返回括号内的任意数据
# 神速力
print(random.sample(['老魔杖', '无限宝石', '贤者之石', '神速力', '万花筒写轮眼'], 2))  # 自定义随机返回括号内的任意数据的个数
# ['贤者之石', '老魔杖']
pk = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A', '小王', '大王']
random.shuffle(pk)  # 随机返回1到6之间的任意整数
print(pk)
# [4, 9, '大王', 10, 'K', 6, 3, 'A', 2, 8, 5, 7, 'Q', '小王', 'J']
  • 一道面试题
import random

code = ''  # 定义全局变量用于存储所有的验证码
# 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)

for i in range(5):  # 循环五次
    figure = str(random.randint(0, 9))  # 随机在0到9产生一个数字
    capital_letter = chr(random.randint(97, 122))  # 随机在a到z产生一个数字
    small_letter = chr(random.randint(65, 90))  # 随机在A到Z产生一个数字
    res = random.choice([figure, capital_letter, small_letter])  # 在数字、小写字母、大写字母中随机抽取一个数据
    code += res  # 将这次循环抽取的数据加到全局变量变量名
print(code)  # 打印循环结束后的全局变量变量名

img

hashlib加密模块

  • 加密
1.什么是加密
加密就是将我们看得懂的数据处理成为我们看不懂的数据

2.为什么要加密
有些不能让他人获得的数据就需要加密

3.如何判断是否加密
一般加密后数据会是一串没有规则的数字字母组合

4.加密算法
加密算法就是对明文数据采取的加密方法
不同加密算法加密后的长短不一样,一般加密后越长,加密算法也越复杂
  • 加密算法
1.常见的加密算法
_md5	_sha1	_sha3	hmac

2.使用方法
import hashlib

md5 = hashlib.md5()  # 选择md5加密算法
md5.update(b'110')  # 添加要加密的数据,数据必须是bytes类型
res = md5.hexdigest()  # 获取加密结果
print(res)
# 5f93f983524def3dca464469d2cf9f3e
  • 解密
1.加密后的结果一般是不能解密的,很多解密其实只是假设密码后,在用各种算法加密成密文,在用密文进行对比,来获取明文

2.同样的明文数据用同样的算法加密出来的密文也是一样的
import hashlib

md5 = hashlib.md5()  # 选择md5加密算法
# md5.update(b'110')  # 添加要加密的数据,数据必须是bytes类型
# md5.update(b'911')  # 添加要加密的数据,数据必须是bytes类型
# res = md5.hexdigest()  # 获取加密结果
# print(res)
# 1522c605dfa5a951ae2f552bea28e207
md5.update(b'110911')
res1 = md5.hexdigest()
print(res1)
# 1522c605dfa5a951ae2f552bea28e207

3.加盐处理(salt)
import hashlib

md5 = hashlib.md5()  # 选择md5加密算法
pwd = input('pwd>>>:')  # 110
md5.update('盐也就是干扰项'.encode('utf8'))  # 这家干扰项
md5.update(pwd.encode('utf8'))  # 将干扰项和明文一起加密
res = md5.hexdigest()  # 获取加密结果
print(res)
# ebbaf98b855a5f3b387b7d5cc28394b1

4.动态加盐(salt)
干扰项每次都不一样,这样密文也每次都不一样
import hashlib, time

md5 = hashlib.md5()  # 选择md5加密算法
pwd = input('pwd>>>:').strip()  # 110
md5.update(f'{time.time()}'.encode('utf8'))  # 这家干扰项
md5.update(pwd.encode('utf8'))  # 将干扰项和明文一起加密
res = md5.hexdigest()  # 获取加密结果
print(res)
# 034626de53ae1e9a5d07ccaf92fb5517
  • 加密的实际应用
1.加密常用在用户信息的保护,像注册、登录的密码就要进行加密
2.文件安全性效验
正规的数据程序要对内容进行加密,下载网址提供软件文件内容对应密文,然后对比密文是否一致,若不一致则表示被更改过植入了病毒
3.大程序加密
程序文件太大时,将内容全部加密,会很慢,这时就可以不对所有内容进行加密,只加密一部分,像每隔500M加密50bytes

subprocess远程命令模块

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'))
# stdout执行命令正确的返回结果
print(sub.stderr.read().decode('gbk'))
# stderr执行命令错误的返回结果
img

logging日志模块

日志模块

1.日志是用于记录事物的发生
2.日志的等级
import logging

logging.debug('debug等级')  # 10
logging.info('info等级')  # 20
logging.warning('warning等级')  # 30
logging.error('error等级')  # 40
logging.critical('critical等级')  # 50
# 默认从warning等级开始记录日志

2.使用模板
import logging

file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
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('记录一下')

日志模块组成部分

import logging

# 1.日志的产生(准备原材料)        logger对象
logger = logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品)        filter对象(可以忽略 不用使用)
# 3.日志的产出(成品)             handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端
# 4.日志的格式(包装)             format对象
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')
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)  # 绑定hd1对象
logger.addHandler(hd2)  # 绑定hd2对象
logger.addHandler(hd3)  # 绑定hd3对象
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)  # 使用fm1格式
hd2.setFormatter(fm2)  # 使用fm2格式
hd3.setFormatter(fm1)  # 使用fm1格式
# 7.设置日志等级
logger.setLevel(10)  # debug
# 8.记录日志
logger.debug('无限宝石')
"记录日志是直接调用模块即可,无需重新写"
img

日志配置字典

import logging.config
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

# 自定义文件路径
logfile_path = 'a3.log'
# 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'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
    },
}

logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger1 = logging.getLogger('购买记录')
logger1.debug('老魔杖 贤者之石')

posted @ 2022-07-21 20:44  无言以对啊  阅读(43)  评论(0)    收藏  举报