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
    
#所以我们一般都是禁止弱密码,若口令,容易被暴力破解。

image

  • 加密模块补充说明

  • 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
    

image

  • 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'))

正确指令返回
image

错误指令返回

image

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
    
posted @ 2022-07-21 21:46  名字长的像一只老山羊  阅读(38)  评论(0编辑  收藏  举报