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随机数模块
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) # 打印循环结束后的全局变量变量名
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执行命令错误的返回结果
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('无限宝石')
"记录日志是直接调用模块即可,无需重新写"
日志配置字典
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('老魔杖 贤者之石')