栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python-模块(5)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python-模块(5)

内容概览
  • openpyxl模块读取数据
  • random随机数模块
  • hashlib加密模块
  • subprocess模块
  • 日志模块
openpyxl模块读取数据
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()洗牌,打乱数据值
hashlib加密模块
"""
加密就是将明文数据(能直接看懂)经过处理后变成密文数据(不能直接看懂)
加密的目的是为了让敏感的数据不会轻易泄露
一般来说,一长串没有规则的数字字母符号组合的数据都是加密后的结果
加密算法就是对明文数据采取的加密策略,一般加密后的密文数据越长,说明加密的算法越复杂
常见的加密算法: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')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号