-
目录
-
openpyxl模块
-
random随机模块
-
hashlib加密模块
-
subprocess模块
-
logging模块
-
-
openpyxl模块
1.读取:openpyxl不擅长读数据 所以有一些模块优化了读取的方式-pandas模块
from openpyxl import Workbook wb = Workbook() wb.save(r'红牛公司信息统计表.xlsx') wb1 = wb.create_sheet('信息统计表', 0) wb1.append(['公司名称', '公司地址', '公司邮箱', '公司电话']) wb.save(r'红牛公司信息统计表.xlsx') from openpyxl import load_workbook wb = load_workbook(r'红牛公司信息统计表.xlsx', data_only=True) print(wb.sheetnames) # 查看所有工作簿 print(wb1.max_row) # 有数据最大行 1 print(wb1.max_column) # 有数据最大列 4 print(wb1['A1'].value) # 获取A1的数据 公司名称 print(wb1.cell(row=1, column=2).value) # 另一种取值方式 公司地址 for i in wb1.rows: print([j.value for j in i]) # ['公司名称', '公司地址', '公司邮箱', '公司电话'] for j in wb1.columns: print([i.value for i in j])
2.pandas模块(基于openpyxl模块):对excel表格操作更方便
import requests,pandas # 读取页面数据 with open(r'hn.html', 'r', encoding='utf8') as f: data = f.read() # 研究目标数据的特征 编写正则筛选# 1.获取所有的分公司名称 company_name_list = re.findall('<h2>(.*?)</h2>', data) # print(res)# 2.获取所有的分公司地址 company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data) # print(company_addr_list)# 3.获取所有的分公司邮箱 company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data) # print(company_email_list)# 4.获取所有的分公司电话 company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data) print(company_phone_list) d = {'公司名称': company_name_list, '公司地址': company_addr_list, '公司邮箱': company_email_list, '公司电话': company_phone_list } df = pandas.DataFrame(d) df.to_excel(r'111.xlsx')
-
random随机模块:有趣并好玩的模块
1.random函数:随机获取0-1之间的浮点数
import random res = random.random() print(res) # 0.25971756085753495
2.choice函数:随机获取数据中值
import random l1 = [1, 3, 5, 6] res = random.choice(l1) # l1中的随机数 print(res)
3.unifore函数:需要a,b两个参数,返回的值是a-b范围内随机的浮点型
import random print(random.uniform(1.9)) # 8.94712302571186
4.randint函数:需要a,b两个参数,返回的值是a-b范围内随机的整数
import random print(random.randint(1, 9)) # 3
# 获取随机验证码
def indent_code(n):
# 1.定义存储验证码
code = ''
# 3.循环打印验证码个数
for i in range(n):
num1 = random.randint(0, 9)
num2 = chr(random.randint(65, 90))
num3 = chr(random.randint(97, 122))
num = random.choice([num1, num2, num3])
num = str(num)
# 4.数据整合
code += num
return code
print(indent_code(3))
print(indent_code(5))
5.sample函数:从数据中获取规定数量的随机数
import random count = 1 while count < 4: gift = ['💣', '🎈', '🔫', '🎂'] luck = random.sample(gift, 1) # sample(数据,个数) 从数据中获取规定数量的随机数 count += 1 print(f'哈哈哈哈你被幸运{luck}砸中啦')
6.randrange函数:三个参数 ,a=开始数据 b=结束数据 c=间距
import random print(random.randrange(1, 9, 2))
7.shuffle函数:打乱原有数据顺序(洗一洗)
import random l1 = [1, 3, 5, 6] random.shuffle(l1) # shuffle(数据) print(l1)
-
hashlib加密模块
1.加密定义:将明文(看的懂)通过代码操作转变成密文(看不懂),加密没有绝对的安全,只有更安全。
2.加密的作用:防止重要数据泄露
3.加密方法:md5 sha系列 hmac base64
3.1 md5方法 :不可逆加密
3.1.1 解密方法:通过大量计算,得出很多密文,然后匹配密文
import hashlib md5 = hashlib.md5() md5.update(b'123') print(md5.hexdigest()) # 202cb962ac59075b964b07152d234b70
3.2 只要明文数据一致,用相同的加密方法得出的密文一致
import hashlib md5 = hashlib.md5() md5.update(b'123abc987') print(md5.hexdigest()) # 59ce83185eaea0ef841540ed77d11bd6 md5 = hashlib.md5() md5.update(b'123') md5.update(b'abc') md5.update(b'987') print(md5.hexdigest()) # 59ce83185eaea0ef841540ed77d11bd6
3.3 加盐(加点盐迷惑一下)
import hashlib md5 = hashlib.md5() password = input('password>>>:').strip() md5.update('设置的盐(干扰项)'.encode('utf8')) md5.update(password.encode('utf8')) res = md5.hexdigest() print(res) # 30faf565ac9a30b1bb672691776f1185
3.4 动态加盐(salt):每次干扰项不一致
3.5 加密实际应用场景
3.5.1.用户密码加密
注册存储密文 登录也是比对密文
3.5.2.文件安全性校验
正规的软件程序写完之后做一个内容的加密
网址提供软件文件记忆该文件内容对应的密文
用户下载完成后不直接运行 而是对下载的内容做加密
然后比对两次密文是否一致 如果一致表示文件没有被改
不一致则表示改程序有可能被植入病毒
3.5.3.大文件加密优化(查看文件大小os.path.getsize)
程序文件100G
一般情况下读取100G内容然后全部加密 太慢
不对100G所有的内容加密 而是截取一部分加密
eg:每隔500M读取30bytes
-
subprocess模块:模拟计算机cmd模块
import subprocess cmd = input('请输入您的指令>>>:').strip() sub = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # stdout执行命令之后正确的返回结果 print(sub.stdout.read().decode('gbk')) # stderr执行命令报错之后的返回结果 print(sub.stderr.read().decode('gbk'))
-
logging日志模块
1.定义:记录软件运行所发生事件的方法
2.作用:记录事情发生的事实,方便查找事实真相
3.等级:
import logging
logging.debug('debug等级') # 10
logging.info('info等级') # 20
logging.warning('warning等级') # 默认从warning级别开始记录日志 30
logging.error('error等级') # 40
logging.critical('critical等级') # 50
4.基本使用方法
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('我很好!!!')
5.组成部分
5.1 logger:提供记录日志的方法
logger = logging.getLogger('使用记录')
5.2 filter:日志的过滤,可忽视
5.3 handler:选择日志的输出地方(一个logger添加多个handler)
hd1 = logging.FileHandler('a1.log', encoding='utf-8') # 输出到文件中 hd2 = logging.FileHandler('a2.log', encoding='utf-8') # 输出到文件中 hd3 = logging.StreamHandler() # 输出到终端
5.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.5 给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
5.6 给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
5.7 设置日志等级
logger.setLevel(10) # debug
5.8 记录日志
logger.debug('哈哈哈哈')
6.日志配置字典
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]' #其中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配置 # '购物车记录': { # 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 # 'level': 'WARNING', # 'propagate': True, # 向上(更高level的logger)传递 # }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置 }, } logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger('购物车记录') logger1.warning('尊敬的VIP客户 晚上好 您又来啦') logger1 = logging.getLogger('注册记录') logger1.debug('jason注册成功') logger1 = logging.getLogger('顾客消费记录') logger1.debug('哈哈哈哈')
posted on
浙公网安备 33010602011771号