zoukankan      html  css  js  c++  java
  • 包和loggging模块

    跨文件夹导入模块:

    如果a文件夹所在目录在环境变量,a文件夹中的ma模块可以被以下方式导入
    import a.ma  |  from a import ma
    
    2.如果a文件夹所在目录在环境变量,a文件夹中的b文件夹的mb模块可以被以下方式导入
    import a.b.mb    |   from a.b  import mb
    
    
    3.如果a文件夹所在目录在环境变量,a文件夹中的b文件夹的mb模块中的bbb名字要被直接导入。
    from a.b.mb import bbb  
    
    注意:  .的左侧必须的文件夹

    包:

    包就是一系列模块的结合体,用文件夹来管理一系列有联系的模块,该文件夹就可以被称之为包,文件夹名为包名。

    注:包与普通的文件夹不同,包的文件夹中一定存在一个__init__.py文件。

    __init__.py文件:

    1.产生一个全局名称空间,提供给包的,就代表包的名称空间

    2.管理 包可以直接点出来使用的名字

    导包的三件事:

    首先还是产生执行文件的名称空间

      1.创建包文件夹下的__init__.py文件的名称空间

      2.执行包文件夹下的__init__.py文件,并将执行过程中产生的名字放入包下面的__init__.py文件的名称空间里面

      3.执行文件的名称空间拿到指向包下面的__init__.py文件名称空间里面的名字

    直接使用包中模块:

    如果只是想作为普通文件夹,py3中可以省略__init__文件,本质上文件夹也是包

    导入的手段:1.指名道姓到某一个模块   | 2.指名道姓到某一个模块中名字

    包的管理:

    在包中采用相对导入管理模块或模块中名字

    在包的__init__.py文件或是包中任意一个模块中

    . 代表当前文件所在目录

    ..代表上一级文件目录

    注意:.语法不能包,因为包外的文件都能够自执行,但.语法的导入的只能是模块与模块之间的,不能在执行文件中使用。

    当你作为包的设计者来说:

      1.当模块的功能特别多的情况下,应该分文件管理

      2.每个模块之间为了避免后期模块改名的问题,你可以使用相对导入(包里面的文件应该都是模块)

    站在包的开发者:如果使用绝对路径来管理包的自己的模块,那么它只需要永远以包的路径为基准依次导入模块

    站在包的使用者:你必须得将包所在的那个文件夹路径添加到system path中(系统环境变量中)

    注:

    python2中要手动加__init__.py文件,py3不加也不会报错,当你在删除不要 的文件,千万不要随便删除__init__.py文件。

    标准三流:

    import sys
    sys.stdin:input的底层
    
    sys.stdout: print的底层
    sys.stdout.write('输出信息')
    
    sys.stderr:异常及logging默认打印方式的底层
    sys.stderr.write('输出的信息
    ')

    logging模块:

    操作日志的模块

    日志:日常的流水,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中

    在正常的项目中,项目运行的一些打印信息,采用logging打印到文件中,这个过程就叫做记录日志。

    import logging
    
    # logging为默认打印者,名字叫root,配置采用以下方式
    h1 = logging.StreamHandler()
    h2 = logging.FileHandler('d.log')
    logging.basicConfig(
        # filename='my.log',
        # filemode='w',
        # stream=sys.stderr,  # 往控制台打印采用具体的输出流
        format='%(asctime)s [%(levelname)s]- %(name)s: %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        level=logging.DEBUG,  # 10, 代表DEBUG及DEBUG级别以上都能输出
        handlers=[h1, h2]
    )
    
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
    logging.critical("critical")

    logging的四大成员:

    logger:是产生日志的

    filter:过滤日志的

    handler:设置日志输出的位置

    formmater:设置日志输出的格式

    日志的五个等级

    debug:调试信息  10级

    info:正常信息  20级

    warning:警告信息   30级

    error:错误信息   40级

    critical:危险信息  50级

    配置文件的使用:

    # 1.配置
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'o_fmt1': {
                'format': '%(name)s:%(asctime)s - %(message)s'
            },
            'o_fmt2': {
                'format': '%(name)s:%(asctime)s [%(levelname)s] - %(message)s'
            }
        },
        'filters': {},
        'handlers': {
            'o_cmd': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'o_fmt1'
            },
            'o_file': {
                'level': 'WARNING',
                'class': 'logging.handlers.RotatingFileHandler',
                'formatter': 'o_fmt2',
                'filename': r'F:python8期课堂内容day20代码part4logging.log',  # 日志文件
                'maxBytes': 1024*1024*5,  # 日志大小 5M
                'backupCount': 5, #日志文件最大个数
                'encoding': 'utf-8',  # 日志文件的编码
            }
        },
        'loggers': {
            'o_owen': {
                'level': 'DEBUG',
                'handlers': ['o_cmd', 'o_file']
            },
            '': {
                'level': 'DEBUG',
                'handlers': ['o_file']
            }
        }
    }
    
    # 2.加载配置
    import logging.config
    logging.config.dictConfig(LOGGING_DIC)
    
    
    # 3.使用
    log = logging.getLogger('o_owen')
    log.warning('123')

    haslib模块:

    加密模块,是用来做一些需要保密的对象

    用法:

    import haslib

    md = haslib.md5()  # md5算法

    md.update(加密的数据).encode('utf-8')  # 别忘了编码

    md.hexdigest()提交上去

    这个md5没有解密 的,只能碰撞解密。并且还再你要加密的数据上面再加盐下去,保证安全性。

    openpyxl模块:

    操作excel表格的模块

    03版本之前 excel表格的后缀名叫xls

    03版本之后  excel表格的后缀名为xlsx

    xlwd  写excel

    xlrt  读excel

    xlwd和xlrt既支持03版本之前的excel文件也支持03版本之后的excel文件
    openpyxl 只支持03版本之后的 xlsx

    from openpyxl import Workbook
    wb = Workbook()  # 先生成一个工作簿
    wb1 = wb.create_sheet('index',0)  # 创建一个表单页  后面可以通过数字控制位置
    wb2 = wb.create_sheet('index1')
    wb1.title = 'login'  # 后期可以通过表单页对象点title修改表单页名称
    wb1['A3'] = 666
    wb1['A4'] = 444
    wb1.cell(row=6,column=3,value=88888888)
    wb1['A5'] = '=sum(A3:A4)'
    wb2['G6'] = 999
    wb1.append(['username','age','hobby'])
    wb1.append(['jason',18,'study'])
    wb1.append(['egon',84,'女教练'])
    
    
    保存新建的excel文件
    wb.save('test.xlsx')
    
    
    from openpyxl import load_workbook  # 读文件
    
    
    wb = load_workbook('test.xlsx',read_only=True,data_only=True)
    print(wb)
    print(wb.sheetnames)  # ['login', 'Sheet', 'index1']
    print(wb['login']['A3'].value)
    print(wb['login']['A4'].value)
    print(wb['login']['A5'].value)  # 通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
    
    res = wb['login']
    print(res)
    ge1 = res.rows
    for i in ge1:
        for j in i:
            print(j.value)
    View Code

    深浅拷贝:

    值拷贝:b拷贝了a,那么只要a的内容发生改变,那么b里面的内容也会发生改变

    浅拷贝:只有a里面的可变类型发生改变,b才会发生改变了

    深拷贝:2者没关系,随a怎么变,b不会发生改变

    import copy
    
    l = [1,2,[1,2]]
    # l1 = l
    # print(id(l),id(l1))
    # l1 = copy.copy(l)  # 拷贝一份 .......  浅拷贝
    # print(id(l),id(l1))
    # # l[0] = 222
    # # print(l,l1)
    # l[2].append(666)
    # print(l,l1)
    l1 = copy.deepcopy(l)
    l[2].append(666)
    print(l,l1)
    View Code
  • 相关阅读:
    国内大学毕业论文LaTeX模板集合
    LATEX论文排版学习资源汇总
    论文神器Latex30分钟快速入门教程-只需9步向学神看齐
    smartdraw2013破解方法
    科研常用的软件
    推荐科研软件
    斯坦福大学科研软件
    【LaTeX】E喵的LaTeX新手入门教程(6)中文
    【LaTeX】E喵的LaTeX新手入门教程(5)参考文献、文档组织
    【LaTeX】E喵的LaTeX新手入门教程(4)图表
  • 原文地址:https://www.cnblogs.com/xinfan1/p/11215298.html
Copyright © 2011-2022 走看看