【2022-07-21】Python模块大全
python模块大全
openpyxl模块读取数据
# openpyxl也可以实现读写分离,读写数据使用的模块不一样
from openpyxl import Workbook, load_workbook
# 写入文件
# wb = Workbook()
# wb1 = wb.create_sheet('顾客消费记录', 0)
# wb2 = wb.create_sheet('公司年度账单', 1)
#
# wb1.append(['username', 'age', 'gender', 'consume'])
# wb1.append(['jason', '18', 'male', '2000'])
# wb1.append(['tony', '28', 'male', '1000'])
# wb1.append(['kevin', '30', 'male', '3000'])
# wb1['D5'] = '=sum(D2:D4)'
# wb.save(r'顾客消费.xlsx')
# 读取文件
wb = load_workbook(r'顾客消费.xlsx', data_only=True)
# print(wb.sheetnames ) # 查看Excel文件中所有的工作簿名称 ['顾客消费记录', '公司年度账单', 'Sheet']
wb1 = wb['顾客消费记录']
# print(wb1.max_row) # 显示当前工作簿中的行数 5
# print(wb1.max_column) # 显示当前工作簿中的列数 4
# print(wb1['B2'].value) # 18
# print(wb1.cell(row=3, column=2).value) # 28
# print(wb1.rows) # <generator object Worksheet._cells_by_row at 0x000001A3F3FC29E0>
for i in wb1.rows: # 读行
print([j.value for j in i]) # ['username', 'age', 'gender', 'consume']
# ['jason', '18', 'male', '2000']
# ['tony', '28', 'male', '1000']
# ['kevin', '30', 'male', '3000']
# [None, None, None, None]
for j in wb1.columns: # 读列
print([i.value for i in j]) # ['username', 'jason', 'tony', 'kevin', None]
# ['age', '18', '28', '30', None]
# ['gender', 'male', 'male', 'male', None]
# ['consume', '2000', '1000', '3000', None]
"""
openpyxl不擅长读取数据,在python中有一些模块优化了读取的方式,比如pandas模块
"""
random随机验证模块
import random
# print(random.random()) # 随机返回0-1之间的小数
# print(random.randint(1, 6)) # 随机返回1-6之间的整数
# print(random.choice(['特等奖', '一等奖', '二等奖', '三等奖', '普天同庆奖'])) # 随机抽取数据值,可以是一个也可以是多个
# print(random.sample(['柳宗元', '韩愈', '欧阳修', '苏洵', '苏澈', '苏轼', '王安石', '曾巩'], 2)) # ['韩愈', '欧阳修']
# l1 = [2, 3, 4, 5, 6, 7, 8, 9, 'J', 'Q', 'K', 'A']
# random.shuffle(l1)
# print(l1) # [5, 4, 'A', 3, 8, 9, 2, 'Q', 7, 'K', 6, 'J']
"""搜狗python工程师笔试题"""
# code = '' # 定义全局变量用于存储所有的验证码
# 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)
# 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) # 68rKk
def get_code(n):
code = '' # 定义全局变量用于存储所有的验证码
# 编写python代码 产生五位随机验证码(数字、小写字母、大写字母)
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(6)
print(res) # 3Yp792
res1 = get_code(7)
print(res1) # t7y9Bsi
hashlib加密模块
1.什么是加密
将明文数据(看得懂)经过处理之后变成密文数据(看不懂)的过程
2.为什么要加密
不想让敏感的数据轻易的泄露
3.如何判断当前数据值是否已经加密
一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
4.加密算法
就是对明文数据采用的加密策略
不同的加密算法复杂度不一样 得出的结果长短也不一样
通常情况下加密之后的结果越长 说明采用的加密算法越复杂
5.常见加密算法
md5 sha系列 hmac base64
6.代码实操
import hashlib
# 加密的过程
md5 = hashlib.md5() # 将MD5加密算法作为数据的加密策略
md5.update(b'666') # 数据类型必须是bytes类型
res = md5.hexdigest() # 获取加密后的结果
print(res) # fae0b27c451c728867a567e8c1bb4e53
7.加密后的结果一般情况下不能反解密
"""
所谓的反解密很多时候其实是偷换概念
提前假设别人的密码是什么 然后用各种算法算出对应的密文
之后构造对应关系 然后比对密文 最终映射明文
{'密文1':123,'密文2':321,...}
"""
8.只要明文数据是一样的那么采用相同的算法得出的密文肯定一样
import hashlib
# md5 = hashlib.md5()
# md5.update(b'hello')
# md5.update(b'word')
# md5.update(b'666')
# res = md5.hexdigest()
# print(res) # 9fb933865f1c3466fb3a15962a4b0545
# md5 = hashlib.md5()
# md5.update(b'helloword666')
# res = md5.hexdigest()
# print(res) # 9fb933865f1c3466fb3a15962a4b0545
9.加盐处理(salt),目的在于增加密码的复杂度和安全性
password = input('password>>>:').strip()
md5.update('公司设置的盐(干扰项)'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest()
print(res) # 149ee4b95d9c02273643e55ea7baf6ab
10.动态加盐(salt)
干扰项每次都不一样
eg:每次获取当前时间 每个用户用户名截取一段
11.加密实际应用场景
1.用户密码加密
注册存储密文 登录也是比对密文
2.文件安全性校验
正规的软件程序写完之后做一个内容的加密
网址提供软件文件记忆该文件内容对应的密文
用户下载完成后不直接运行 而是对下载的内容做加密
然后比对两次密文是否一致 如果一致表示文件没有被改
不一致则表示改程序有可能被植入病毒
3.大文件加密优化
程序文件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'))
日志模块
1.什么是日志
日志就类似于是历史记录
2.为什么要使用日志
为了记录事物发生的事实(史官)
3.如何使用日志
默认从warning级别开始记录日志
3.1.日志等级
import logging
logging.debug('debug等级') # 10
logging.info('info等级') # 20
logging.warning('warning等级') # 30
logging.error('error等级') # 40
logging.critical('critical等级') # 50
3.2.基本使用
import logging
file_handler = logging.FileHandler(filename='alarm.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)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(10) # debug
# 8.记录日志
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]' #其中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('这是一个重要告警')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('jason tony kevin')
课题演练
爬虫实战篇之链接二手房
import re
import pandas
# 1.向目标地址发送网络请求
# info = requests.get('https://sh.lianjia.com/ershoufang/')
# 2.保存数据信息
# with open(r'lianjia.html', 'wb') as f:
# f.write(info.content)
with open(r'lianjia.html', 'r', encoding='utf8') as f:
data = f.read()
# 3.研究目标数据,进行筛选
title = re.findall('<a class="" href=".*?" target=".*?" data-log_index=".*?" data-el=".*?" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>', data)
# print(title)
home_name = re.findall('<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>', data)
# print(home_name)
home_address = re.findall(' - <a href=".*?" target="_blank">(.*?)</a>', data)
# print(home_address)
home_info = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', data)
# print(home_info)
home_others = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', data)
# print(home_others)
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)
home_info_list = {
'房屋标题': title,
'小区名称': home_name,
'所在街道': home_address,
'具体信息': home_info,
'其他信息': home_others,
'房屋总价': home_total_price,
'房屋单价': home_unit_price
}
df = pandas.DataFrame(home_info_list)
df.to_excel('链家二手房信息.xlsx')
分类:
python模块大全
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)