- openpyxl模块读取数据
- random随机数模块
- hashlib加密模块
- subprocess模块
- 日志模块
from openpyxl import load_workbook # 导入load_workbook类读取数据
wb = load_workbook(r'a.xlsx', data_only=True)
print(wb.sheetname) # 查看工作簿中所有工作表名称
ws = wb['1'] # 通过工作表名称获取工作表
print(ws.max_row) # 查看使用了多少行
print(ws.max_column) # 查看使用了多少列
print(ws['A1'].value) # 通过索引的方式取值
print(ws.cell(row=2, column=4).value) # 通过行列取值
for i in ws.rows: # 循环获取每一行数据
print([j.value for j in i]) # 循环获取一行中每列数据并打印
for j in ws.columns: # 循环获取每一列数据
print([i.value for i in j]) # 循环获取每列中每一行数据并打印
"""openpyxl不擅长读数据,所以有模块优化了读取的方式"""
"""pandas"""
import pandas
d = {
'姓名':['a', 'b', 'c', 'd'],
'年龄':[11, 22, 33, 44],
'薪资':[111, 222, 333, 444]
}
df = pandas.DataFrame(d)
df.to_excel(r'123.xlsx')
"""已经将数据以键为一列的第一个数据,值依次填写进去了"""
random随机数模块
import random
# random 返回0到1之间的随机小数
print(random.random())
# randint 返回指定数值之间的整数
print(random.randint(1, 6))
# choice 从数据中随机抽取一个
print(random.choice(['xm','xh','xb']))
# sample 随机抽取自定义个数
print(random.sample('123456789', 3))
# shuffle 打乱容器类型数据中的数据值
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(l1)
print(l1) # [9, 4, 3, 8, 7, 2, 5, 6, 1]
| 方法 | 说明 |
|---|---|
| random.random() | 随机获取0-1之间的小数 |
| random.randint() | 随机获取指定数字之间的整数 |
| random.choice() | 随机获取指定数据中一个数据值 |
| random.sanple() | 随机获取指定数据中指定个数的数据值 |
| random.shuffle() | 洗牌,打乱数据值 |
"""
加密就是将明文数据(能直接看懂)经过处理后变成密文数据(不能直接看懂)
加密的目的是为了让敏感的数据不会轻易泄露
一般来说,一长串没有规则的数字字母符号组合的数据都是加密后的结果
加密算法就是对明文数据采取的加密策略,一般加密后的密文数据越长,说明加密的算法越复杂
常见的加密算法:md5,sha系列,hmac,base64
"""
import hashlib
md5 = hashlib.md5() # 先选择加密策略
md5.update(b'123456') # 选择需要加密的数据,数据需要是bytes类型
res = md5.hexdigest() # 获取加密后的结果
print(res) # e10adc3949ba59abbe56e057f20f883e
"""
1.加密之后的结果一般不能反解密
网络上的反解密其实都是将常见的密码加密后的结果拿来比对
"""
"""
2.只要明文数据是一样的,采用相同算法得出的密文也是一样的
"""
md5 = hashlib.md5()
md5.update(b'123')
md5.update(b'abc')
print(md5.hexdigest()) # a906449d5769fa7361d7ecc6aa3f6d28
md5 = hashlib.md5()
md5.update(b'123abc')
print(md5.hexdigest()) # a906449d5769fa7361d7ecc6aa3f6d28
"""
3.加盐处理(salt),在加密明文数据前后,加入指定的额外数据
"""
md5 = hashlib.md5()
pwd = input('password:').strip() # 123456
md5.update('自定义盐(干扰项)'.encode('utf8'))
md5.update(pwd.encode('utf8'))
print(md5.hexdigest()) # a19caa640a3e8bc680c7e16dbe74e83d
"""
4.动态加盐,让每次的盐都不一样,例如使用当前时间加盐
"""
md5 = hashlib.md5()
md5.update(f'{time.time}'.encode('utf8'))
md5.update(b'123456')
print(md5.hexdigest()) # f049a450a7c3ef665281658b2681ba06
"""
加密实际应用场景
1.用户密码加密
注册时存储的密文,登录时也比较密文
2.文件安全性检验
软件写完后会做一个内容的加密
用户下载完软件后也会先对软件加密
对比密文是否一致,不一致则表示软件可能被植入病毒
3.大文件加密优化
对于大文件使用分段加密,既每隔500M加密50bytes
"""
subprocess模块
"""模拟计算机cmd命令窗口"""
import subprocess
cmd = input('cmd指令:').strip()
sub = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=suborocess.PIPE)
# stdout执行命令正确后返回的结果
print(sub.stdout.read().decode('gbk'))
# stderr执行命令报错后返回的结果
print(sub.stderr.read().decode('gbk'))
"""配合网络编程使用,可以远程控制电脑"""
logging日志模块
"""
日志类似于是历史记录
使用日志就是为了记录发生过什么事情
"""
import logging
# 日志等级
logging.debug('debug等级')
logging.info('info等级')
logging.warning('warning等级')
logging.error('error等级')
logging.critical('critical等级')
"""
日志等级默认分为5个
分别对应10、20、30、40、50
"""
# 基本使用
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('error错误')
日志模块组成部分
import logging
# 1.创建日志对象 logger对象
logger = logging.getLogger('日志')
# 2.过滤日志 filter对象 可以忽略
# 3.日志的产出 Handler对象
hd1 = logging.FileHandler('a.log', encoding='utg8') # 输出到文件中
hd2 = 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)
# 6.给Handler对象绑定format对象(选择日志输出格式)
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
# 7.设置日志等级(达到设置等级才输出日志)
logger.setlevel(20) # info等级
logger.info('info等级')
"""
在以后记录日志时,一般不需要这样全部都自己写
直接使用模块提供固定的配置字典调用
"""
#####日志配置字典
import logging
import logging.config
# 1.定义日志输出格式
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'
# 2.设置日志文件路径
logfile_path = 'log.log'
# 3.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'
},
#打印到文件的日志,收集DEBUG及以上的日志
'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('debug等级')
练习
import re
import pandas
import requests
for i in range(1, 11):
res = requests.get(f'https://sh.lianjia.com/ershoufang/pg{i}/')
with open(f'page{i}.txt', 'wb') as f:
f.write(res.content)
for n in range(1,11):
with open(f'page{n}.txt', 'r', encoding='utf8') as f:
data = f.read()
home_title = re.findall(r'
r'data-housecode=".*?" data-is_focus="" data-sl="">(.*?)', data)
home_addr = re.findall(r'(.*?) ', data)
home_area = re.findall(r' - (.*?)', data)
home_info = re.findall(r'(.*?)', data)
home_room, home_size, orientation, home_finish, home_height, home_year, home_type = [[] for i in range(7)]
for i in home_info:
home_room.append(i.split('|')[0])
home_size.append(i.split('|')[1])
orientation.append(i.split('|')[2])
home_finish.append(i.split('|')[3])
home_height.append(i.split('|')[4])
try:
home_type.append(i.split('|')[6])
except IndexError:
home_type.append(i.split('|')[-1])
home_year.append(None)
else:
home_year.append(i.split('|')[5])
home_attention = re.findall(r'(.*?)', data)
home_unit = re.findall(r'(.*?)'
r'', data)
home_total = re.findall(r' (.*?)'
r'万', data)
home_data = {'房屋标题': home_title,
'房屋小区': home_addr,
'房屋街道': home_area,
'房屋户型': home_room,
'房屋面积': home_size,
'房屋朝向': orientation,
'房屋装修': home_finish,
'房屋楼层': home_height,
'完工年份': home_year,
'房屋类型': home_type,
'房屋关注度': home_attention,
'房屋每平价格': home_unit,
'房屋总价格': home_total
}
DF = pandas.DataFrame(home_data)
DF.to_excel(f'excel{n}.xlsx')



