zoukankan      html  css  js  c++  java
  • 常用模块及其使用(二)

    一、模块

    1. 三种来源
    1.内置的
    2.第三方的
    3.自定义的
      四种表示形式
    1.py文件(******)
    2.共享库
    3.文件夹(一系列模块的结合体)(******)
    4.C++编译的连接到python内置的

    2.研究模块与包,还可以站另外两个角度分析不同的问题
      1.模块的开发者
      2.模块的使用者

    3.什么是包?
      他是一系列模块文件的结合体,表示形式就是一个文件夹
      该文件夹内部通常会有一个__init__.py文件
      包的本质还是一个模块

    4.当我们首次导入包:
      先产生一个执行文件的名称空间
        1.创建包下面的__init__.py文件的名称空间
        2.执行包下面___init__.py文件中的代码,将产生的名字放入包下面的__init__.py文件名称空间中
        3.在执行的文件中拿到一个指向包下面的__inint__.py文件名称空间的名字
    5.当你作为包的设计者来说:
      1.模块的功能特别多的情况下,应该分文管理
      2.每个模块之间为了避免后期模块改名的问题,你可以使用相对导入(包里面的文件都应该是被导入的模块)
      站在包的开发者,如果使用绝对路径来管理的自己的模块,name它只需要永远以包的路径为基准依次导入模块
      站在包的使用者,你必须将包所在的那个文件夹路径添加system.path中

    二、loggin模块

    日志模块:用来记录

     import loggin
    1
    logging.basicConfig(filename='access.log', 2 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 3 datefmt='%Y-%m-%d %H:%M:%S %p', 4 level=30, 5 ) 6 7 8 logging.debug('debug日志') # 10 9 logging.info('info日志') # 20 10 logging.warning('warning日志') # 30 11 logging.error('error日志') # 40 12 logging.critical('critical日志') # 50

    logger对象:负责产生日志

    filter对象:过滤日志

    handler对象:控制了日志输出的位置(文件/终端)

    formater对象:规定日志内容的格式

     1 import logging
     2 
     3 # 1.logger对象:负责产生日志
     4 logger = logging.getLogger('转账记录')
     5 # 2.filter对象:过滤日志(了解)
     6 
     7 # 3.handler对象:控制日志输出的位置(文件/终端)
     8 hd1 = logging.FileHandler('a1.log',encoding='utf-8')  # 输出到文件中
     9 hd2 = logging.FileHandler('a2.log',encoding='utf-8')  # 输出到文件中
    10 hd3 = logging.StreamHandler()  # 输出到终端
    11 
    12 # 4.formmater对象:规定日志内容的格式
    13 fm1 = logging.Formatter(
    14         fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    15         datefmt='%Y-%m-%d %H:%M:%S %p',
    16 )
    17 fm2 = logging.Formatter(
    18         fmt='%(asctime)s - %(name)s:  %(message)s',
    19         datefmt='%Y-%m-%d',
    20 )
    21 
    22 # 5.给logger对象绑定handler对象
    23 logger.addHandler(hd1)
    24 logger.addHandler(hd2)
    25 logger.addHandler(hd3)
    26 
    27 # 6.给handler绑定formmate对象
    28 hd1.setFormatter(fm1)
    29 hd2.setFormatter(fm2)
    30 hd3.setFormatter(fm1)
    31 
    32 # 7.设置日志等级
    33 logger.setLevel(10)
    34 
    35 # 8.记录日志
    36 logger.debug('我写完了')

    配置一个log日志用了八个步骤,我们可以将它放入我们的配置文件夹,可以方便我们的使用,但是每次需要到日志功能都要写这八部属实麻烦,然后我们就将日志变成日志配置字典了。这样就会方便很多了。

     1 mport os
     2 import logging.config
     3 
     4 # 定义三种日志输出格式 开始
     5 
     6 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
     7                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
     8 
     9 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    10 
    11 
    12 
    13 # 定义日志输出格式 结束
    14 """
    15 下面的两个变量对应的值 需要你手动修改
    16 """
    17 logfile_dir = os.path.dirname(__file__)  # log文件的目录
    18 logfile_name = 'a3.log'  # log文件名
    19 
    20 # 如果不存在定义的日志目录就创建一个
    21 if not os.path.isdir(logfile_dir):
    22     os.mkdir(logfile_dir)
    23 
    24 # log文件的全路径
    25 logfile_path = os.path.join(logfile_dir, logfile_name)
    26 # log配置字典
    27 LOGGING_DIC = {
    28     'version': 1,
    29     'disable_existing_loggers': False,
    30     'formatters': {
    31         'standard': {
    32             'format': standard_format
    33         },
    34         'simple': {
    35             'format': simple_format
    36         },
    37     },
    38     'filters': {},  # 过滤日志
    39     'handlers': {
    40         #打印到终端的日志
    41         'console': {
    42             'level': 'DEBUG',
    43             'class': 'logging.StreamHandler',  # 打印到屏幕
    44             'formatter': 'simple'
    45         },
    46         #打印到文件的日志,收集info及以上的日志
    47         'default': {
    48             'level': 'DEBUG',
    49             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
    50             'formatter': 'standard',
    51             'filename': logfile_path,  # 日志文件
    52             'maxBytes': 1024*1024*5,  # 日志大小 5M
    53             'backupCount': 5,
    54             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
    55         },
    56     },
    57     'loggers': {
    58         #logging.getLogger(__name__)拿到的logger配置
    59         '': {
    60             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    61             'level': 'DEBUG',
    62             'propagate': True,  # 向上(更高level的logger)传递
    63         },  # 当键不存在的情况下 默认都会使用该k:v配置
    64     },
    65 }
    66 
    67 
    68 # 使用日志字典配置
    69 logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
    70 logger1 = logging.getLogger('zzzzzj')
    71 logger1.debug('这回终于轻松了很多')

    三、hashlib模块

    hashlib模块,加密的模块

    1 import hashlib  # 这个加密的过程是无法解密的
    2 md = hashlib.sha3_256()  # 生成一个帮你造密文的对象
    3 md.update('hello'.encode('utf-8'))  # 往对象里传明文数据  update只能接受bytes类型的数据
    4 md.update(b'zzj666')  # 往对象里传明文数据  update只能接受bytes类型的数据
    5 print(md.hexdigest())  # 获取明文数据对应的密文

    密文的长度越长,内部对应的算法就越复杂,但是时间消耗就越长,占用空间也更大,通常情况下使用md5算法,就足够了。

    1 import hashlib
    2 # 传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
    3 md = hashlib.md5()
    4 md.update(b'areyouok?')#把它分开也是一样的
    5 md.update(b'are')
    6 md.update(b'you')
    7 md.update(b'ok?')
    8 print(md.hexdigest())  # 408ac8c66b1e988ee8e2862edea06cc7

    hashlib模块应用场景

    1.密码的密文存储

    2.校验文件内容是否一致

    加盐处理:

    1 import hashlib
    2 
    3 md = hashlib.md5()
    4 # 公司自己在每一个需要加密的数据之前 先手动添加一些内容
    5 md.update(b'oldboy.com')  # 加盐处理
    6 md.update(b'hello')  # 真正的内容
    7 print(md.hexdigest())

    但是如果只是单单加盐,千篇一律容易发现你加的“盐”是什么?那么就要用到动态加盐。

    四、openpyxl模块

    openpyxl是比较火的用来操作excel表格的模块(需要先安装openpyxl模块)

    excel写文件:

     1 from openpyxl import Workbook
     2 
     3 wb = Workbook()  # 先生成一个工作簿
     4 wb1 = wb.create_sheet('index',0)  # 创建一个表单页  后面可以通过数字控制位置
     5 wb2 = wb.create_sheet('index1')
     6 wb1.title = 'login'  # 后期可以通过表单页对象点title修改表单页名称
     7 
     8 wb1['A3'] = 666
     9 wb1['A4'] = 444
    10 wb1.cell(row=6,column=3,value=88888888)
    11 wb1['A5'] = '=sum(A3:A4)'
    12 
    13 wb2['G6'] = 999
    14 wb1.append(['username','age','hobby'])
    15 wb1.append(['琦玉',20,'打怪人'])
    16 wb1.append(['杰诺斯',20,'拜师学艺'])
    17 wb1.append(['King',30,'打酱油'])
    18 wb1.append(['邦古',60,'找饿狼'])
    19 wb1.append(['龙卷','18','超能力'])
    20 wb1.append(['性感囚徒','25','男人'])
    21 wb1.append(['饿狼','','收拾英雄'])

    excel读文件:

     1 from openpyxl import load_workbook  # 读文件
     2 
     3 
     4 wb = load_workbook('test.xlsx',read_only=True,data_only=True)
     5 print(wb)
     6 print(wb.sheetnames)  # ['login', 'Sheet', 'index1']
     7 print(wb['login']['A3'].value)
     8 print(wb['login']['A4'].value)
     9 print(wb['login']['A5'].value)  # 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
    10 
    11 res = wb['login']
    12 print(res)
    13 ge1 = res.rows
    14 for i in ge1:
    15     for j in i:
    16         print(j.value)

    七、深浅拷贝

     1 import copy
     2 
     3 l = [1,2,[1,2]]
     4 l1 = l
     5 print(id(l),id(l1))
     6 l1 = copy.copy(l)  # 拷贝一份 .......  浅拷贝
     7 print(id(l),id(l1))
     8 l[0] = 222
     9 print(l,l1)
    10 l[2].append(666)
    11 print(l,l1)
    12 l1 = copy.deepcopy(l)
    13 l[2].append(666)
    14 print(l,l1)

      深浅拷贝图解:

           浅拷贝(copy):

      深拷贝(deepcopy):

     

  • 相关阅读:
    vue-cli3 打包路径参数说明
    vuex使用map在module的模式下的写法
    普通的JS文件中使用vuex
    vue cli 3+ 版本的source map添加方法
    vue-cli的安装及版本查看/更新
    搭建一个vue项目
    无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    Centos7开放及查看端口
    记录一次idae和maven设置的巨坑
    解决npm安装node-sass太慢及编译错误问题
  • 原文地址:https://www.cnblogs.com/spencerzhu/p/11219301.html
Copyright © 2011-2022 走看看