python28模块-openpyxl-pandas-requests-random-hashlib-suprocess-logging模块
今日学习
openpyxl模块读数据
爬取链家二手房数据
random 随机数模块
hashlib加密模块
加密模块补充说明
subprocess 模块
日志模块
日志模块组成部分
日志配置字典
实战应用
openpyxl 模块读取数据
#首先创建一组测试数据
--------------------------------------------------------------
from openpyxl import Workbook, load_workbook
wb = Workbook()
wb1 = wb.create_sheet('红浪漫消费记录', 0)
wb1.append(['jason1', 123, 18, 'male', 'read'])
wb1.append(['jason2', 123, 18, 'male', 'read'])
wb1.append(['jason3', 123, 18, 'male', 'read'])
wb1.append(['jason4', 123, 18, 'male', 'read'])
wb.save(r'121.xlsx')
----------------------------------------------------------
#正文读取数据
from openpyxl import Workbook, load_workbook
#加载
wb = load_workbook(r'121.xlsx')
-----------------------#1.查看excle里的工作簿--------------------------------------------
print(wb.sheetnames)
-------执行结果-------------
# ['红浪漫消费记录', 'Sheet']
---------------------#2.打印红浪漫工作簿有几行--------------------------------------------
wb1 = wb['红浪漫消费记录']
print(wb1.max_row)
-------执行结果-------------
4
----------- -#3.打印几列--------------------------------------------------
print(wb1.max_column)
-------执行结果-------------
5
-----------#4.打印A1的值------------------------------
##打印A1的值
print(wb1['A1'].value)
-----执行结果-----
jason1
-----------#5.打印第二行第二列--------------------------
#打印第二行第二列
print(wb1.cell(row=2,column=2).value)
----执行结果-----
123
-----------#6.读取----------------------------
for j in wb1.columns:
print([i.value for i in j])
---------执行结果-------------------
['jason1', 'jason2', 'jason3', 'jason4', None, None, None, None, None, None, None]
[456, 123, 12, 333, None, None, None, None, None, None, None]
[18, 18, 18, 18, None, None, None, None, None, None, None]
-
总结:
openpyxl不擅长读数据 所以有一些模块优化了读取的方式 pandas模块
import pandas d = { '公司名称': ['老男孩', '老女孩', '老伙计', '老北鼻'], '公司地址': ['上海', '深圳', '杭州', '东京'], '公司电话': [120, 130, 129, 996], } df = pandas.DataFrame(d) -----写入222.xlsx表格-------------------------- df.to_excel(r'222.xlsx')
pandas + requests+re模块实战
pandas模块
(Python Data Analysis Library)是基于numpy的数据分析模块,提供了大量标准数据模型和高效操作大型 数据集所需要的工具,可以说pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一
requests模块
requests模块是一个用于访问网络的模块
re模块
Python提供的一套关于处理正则表达式的模块
-
爬取链家二手房数据
import requests
import re
import pandas
with open(r'lj.html', 'r', encoding='utf8') as f:
data = f.read()
# print(data)
-------------------------------------------------------------------------------
home_title_list = re.findall(
'<a class="" href=".*?" target=".*?" data-log_index=".*?" data-el=".*?" data-housecode=".*?" data-is_focus="".*?"">(.*?)</a>',
data
)
------------------------------------------------------------------------------
home_name_list = re.findall(
'<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>',
data
)
-----------------------------------------------------------------------------------
home_addr_list = re.findall( ' - <a href=".*?" target="_blank">(.*?)</a>',
data)
--------------------------------------------------------------------------- --------
home_info_list = re.findall(
'<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>',
data
)
------------------------------------------------------------------------------------
home_others_list = re.findall(
'<div class="followInfo"><span class="starIcon"></span>(.*?)</div>',
data
)
-------------------------------------------------------------------------------------
home_total_price = re.findall(
'<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>',
data
)
--------------------------------------------------------------------------------------
home_unit_price = re.findall(
'<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>',
data
)
d = {
'房屋标题':home_title_list,
'小区名称':home_name_list,
'所在街道':home_addr_list,
'具体信息':home_info_list,
'其他信息':home_others_list,
'房屋总价':home_total_price,
'房屋单价':home_unit_price
}
df = pandas.DataFrame(d)
df.to_excel(r'333.xlsx')
----------执行结果--------------------
#执行结果已经生成为333.xlsx
random随机模块
-
用于制作随机数的内建模块。
-
下列表格中我只列出了经常使用的。可自行补充
方法 描述 random() 返回0到1之间随机的小数 randint() 返回给顶范围之间的随机数 ( 在给定的整数之间抽一个整数) choice() 返回给定序列中的随机元素,(在给定的序列数据中随机抽一个) sample() 返回给定序列的样本,并随机 shuffle() 接受一个序列,随机排序
import random #导入模块
----------------------------- --------------------------------------------------------
print(random.random()) # 1.返回0到1之间随机的小数
---------执行结果----------
0.5218656325839336
--------------------------------------------------------------------------------------
print(random.randint(1, 6)) #2.随机返回1~6之间的数
---------执行结果----------
4
--------------------------------------------------------------------------------------
print(random.choice(['1等奖','2等奖','3等奖','4等奖']))
#3.随机选择
---------执行结果----------
4等奖
--------------------------------------------------------------------------------------
print(random.sample(['李白','兰陵王','安其拉','紫霞仙子','彭于晏','胡歌','三上悠亚','中村明菜'],4))
# 4.随机抽取4位
---------执行结果----------
['李白', '彭于晏', '三上悠亚', '中村明菜']
--------------------------------------------------------------------------------------
l1 = [2,3,4,5,6,7]
random.shuffle(l1) #5.随机排序
print(l1)
#随机排序
# [3, 5, 7, 4, 2, 6]
-
random实战
"""搜狗python工程师笔试题""" # code = '' # 定义全局变量用于存储所有的验证码 # # 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)
import random code = '' for i in range(5): random_int = str(random.randint(0, 9)) random_lower = chr(random.randint(97, 122)) random_upper = chr(random.randint(65, 90)) temp = random.choice([random_int,random_lower,random_upper]) code += temp print(code) -------执行结果------------- tjXnw -------------------用户自定义获取随机数量--------------- import random def get_code(n): code = '' for i in range(n): random_int = str(random.randint(0, 9)) random_lower = chr(random.randint(97, 122)) random_upper = chr(random.randint(65, 90)) temp = random.choice([random_int,random_lower,random_upper]) code += temp return code res = get_code(10) #验证码获取十个 print(res) ------------执行结果------------- B9Hd215K9M
hashlib加密模块
hashlib模块
就是python集合了各种加密算法的一个模块,比如md5加密,sha算法等。
当然主要的作用就是给数据加密或者计算文件的md5值等。
1.什么是加密?
将铭文数据经过处理后变成密文数据
----------------------------------------------------------------------------------
2.为什么要加密?
不让敏感信息轻易泄露
-----------------------------------------------------------------------------------
3.如何判断当前数据值是否已经加密?
一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
----------------------------------------------------------------------------------
4.加密算法
就是对明文数据采用的加密策略
不同的加密算法复杂度不一样 得出的结果长短也不一样
通常情况下加密之后的结果越长 说明采用的加密算法越复杂
----------------------------------------------------------------------------------
5.常见的加密算法
md5 sha系列 hmac base64
-------------------------小练习-------------------------------------------------------
6.代码实参
import hashlib
md5 = hashlib.md5() # 选择md5加密算法作为数据的加密策略
md5.update(b'123') # 往里面添加明文数据 数据必须是bytes类型
res = md5.hexdigest()
print(res) # 获取加密之后的结果
---- =-- -- ------------执行结果-----------------------
202cb962ac59075b964b07152d234b70
#所以我们一般都是禁止弱密码,若口令,容易被暴力破解。
-
加密模块补充说明
-
1.-----反解密-------
202cb962ac59075b964b07152d234b70
所谓的反解密很多时候其实是偷换概念
提前假设别人的密码是什么 然后用各种算法算出对应的密文
之后构造对应关系 然后比对密文 最终映射明文
-
2.-----明文数据一致-----------
只要是明文数据一致,在相同的加密算法得到的结果都是一样的,一般用于文件的校验比对。比如服务器之间传送文件,客户端下载服务器文件。都可以通过相同的加密算法对文件进行比对
例子: ====================================================================== md5 = hashlib.md5() # 选择md5加密算法作为数据的加密策略 md5.update(b'123') # 往里面添加明文数据 数据必须是bytes类型 md5.update(b'hello') # 往里面添加明文数据 数据必须是bytes类型 md5.update(b'jason') # 往里面添加明文数据 数据必须是bytes类型 res = md5.hexdigest() print(res) ---------执行结果------------------ 31b9a81dc788368469ee4b78877eb1eb ==================================================================== md5.update(b'123hellojason') print(res) ---------执行结果------------------ 31b9a81dc788368469ee4b78877eb1eb
-
3.----加盐处理-------
破解难度大
例子 密码123加盐后。进行md5反查询 ------------------------------------------ import hashlib import random md5 = hashlib.md5() password = input('password>>>:').strip() md5.update('公司设置的盐(干扰项)'.encode('utf8')) md5.update(password.encode('utf8')) res = md5.hexdigest() ------执行结果-------------------- password>>>:123 #密码输入123 print(res) # 78bf5bd131c520b54168206d75f9f9be
-
4----动态加盐(salt)----
干扰每次都不一样,难度加大
每次获取当前时间,每个用户用户名截取一段
-
5---应用场景-------
1.用户密码加密
注册存储密文 登录也是比对密文
2.文件安全性校验
正规的软件程序写完之后做一个内容的加密
网址提供软件文件记忆该文件内容对应的密文
用户下载完成后不直接运行 而是对下载的内容做加密
然后比对两次密文是否一致 如果一致表示文件没有被改
不一致则表示改程序有可能被植入病毒3.大文件加密优化
程序文件100G
一般情况下读取100G内容然后全部加密 太慢不对100G所有的内容加密 而是截取一部分加密
eg:每隔500M读取30bytes
subprocess模块
模拟计算机cmd命令窗口
subprocess 模块主要用于创建子进程;
并连接它们的输入、输出和错误管道,获取它们的返回状态。
通俗地 说就是通过这个模块 你可以在 Python 的代码里执行操作系统级别的命令
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 日志模块
主要用于程序的输出运行日志,可以设置输出日志的等级,日志保存路径,日志文件回滚等
"""日志模块需要你写的代码很少 几乎都是CV"""
------------------------------------------------------------
1.什么是日志
日志就类似于是历史记录
------------------------------------------------------------
2.为什么要使用日志-
为了记录事物发生的事实(史官)
-----------------------------------------------------------
3.如何使用日志
----------------------------------------------------------------------
3.1.日志等级
import logging
logging.debug('debug等级') # 10
logging.info('info等级') # 20
logging.warning('warning等级') # 默认从warning级别开始记录日志 30
logging.error('error等级') # 40
logging.critical('critical等级') # 50
-
3.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('我不好!!!')
--------返回结果------------------
2022-07-21 21:35:16 PM - root - ERROR -start: 我不好!!!
-
日志配置字典
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('慢男 猛男 骚男') -----------执行结果--------------------- [2022-07-21 21:39:06,697][MainThread:8448][task_id:红浪漫顾客消费记录][start.py:62][DEBUG][慢男 猛男 骚男]
-
日志模块实战
-
它属于配置文件
-
字典数据是日志模块固定的配置 写完一次之后几乎都不需要动
# 按照软件开发目录规范编写使用 日志字典数据应该放在哪个py文件内 字典数据是日志模块固定的配置 写完一次之后几乎都不需要动 -------------------------------------------------------------------- 它属于配置文件 """配置文件中变量名推荐全大写""" 该案例能够带你搞明白软件开发目录规范中所有py文件的真正作用 ---------------------------------------------------------------------- def get_logger(msg): # 记录日志 logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger(msg) # logger1.debug(f'{username}注册成功') # 这里让用户自己写更好 return logger1