• Python shutil、shelve、log常用模块2、项目结构


    今日内容:

    一、常用模块 2019.04.10 更新

    • 1.time:时间
    • 2.calendar:日历
    • 3.datatime:可以运算的时间
    • 4.sys:系统
    • 5.os:操作系统
    • 6.os.path:系统路径操作
    • 7.random:随机数
    • 8.json:序列化
    • 9.pickle:序列化

    二、常用模块2 2019.04.11 更新

    • 1.shutil:可以操作权限的处理文件模块
    • 2.shelve:可以用字典存取数据到文件
    • 3.标准输入输出错误流
    • 4.日志模块
    • 5.项目开发结构

    1.shutil:可以操作权限的处理文件模块

    import shutil
    # ----------------------------------
    # 基于路径的文件复制
    # 拷贝文件的格式:(参数列表:目标源文件,目的地址文件)
    # 拷贝文件无返回值,直接在目录里面出现新的文件
    
    shutil.copyfile('aa.txt', 'bb.txt')
    
    # ----------------------------------
    # 基于流的文件复制
    # 语法就是,两个open ,第一个是读源文件,第二个是写到新文件中
    # 通过shutil.copyfileobj(r, w)完成操作
    
    with open('aa.txt', 'rb') as r, open('cc.txt', 'wb') as w:
        shutil.copyfileobj(r, w)
    
    # ----------------------------------
    # 递归删除目标目录
    # 很干脆,一删全没了,全没了
    # 参数是  目标目录的地址
    
    shutil.rmtree('to_del')
    
    # ----------------------------------
    # 文件移动
    # shutil.move(src,dst)
    # 参数:第一个而是要移动的文件,第二个是目的地址路径
    
    shutil.move('aa.txt', 'to_del')
    
    # ----------------------------------
    # 文件夹压缩
    # shutil.make_archive(base_name, format) # 目标文件,压缩格式
    
    # shutil.make_archive('aa.txt', 'tar')
    
    # ----------------------------------
    # 文件夹解压
    # 第一个参数:文件名 ,后面的参数可以不填
    # unpack_archive(filename, extract_dir=None, format=None)
    
    shutil.unpack_archive('aa.txt.zip')
    

    2.shelve:可以用字典存取数据到文件

    import shelve
    # ----------------------------------
    # 将序列化文件操作dump与load进行封装
    # 注:writeback允许序列化的可变类型,可以直接修改值
    # ----------------------------------
    
    # 后面的writeable表示,在更改内存里面的数据的同时,更新文件里面的数据
    # s_dic = shelve.open("target_file", writeback=True)
    
    s_dic = shelve.open("2.py")
    
    # ----------------------------------
    # 序列化:存
    print(s_dic)  
    
    # 当点亮writeback的时候,可以更新文件里面的值 
    # s_dic['key1'] = 'value1' 
    # s_dic['key2'] = 'value2'
    
    # ----------------------------------
    # 反序列化:取
    print(s_dic['key1'])
    
    # ----------------------------------
    # 文件这样的释放
    s_dic.close()
    

    3.标准输入输出错误流

    import sys
    # ----------------------------------
    # print默认是对sys.stdout.write('msg') + sys.stdout.write('
    ')的封装
    # 格式化结束符print:print('msg', end='')
    # 输出,
    sys.stdout.write('msg')
    
    # 输出 error 格式的 message
    sys.stderr.write('msg')
    
    # 读取输入一行的内容
    msg = sys.stdin.readline()
    print(msg)
    
    # 上面所有的内容打印的东西:
    # 451ihi  # 输入的内容
    # msgmsg451ihi  # 异步执行,不知道打印先后顺序
    
    

    4.日志模块

    4.1 logging:日志模块
    1) root logging的基本使用:五个级别
    2)root logging的基本配置:logging.basicConfig()
    3)logging模块四个核心:Logger | Filter | Handler | Formater
    4)logging模块的配置与使用
        -- 配置文件:LOGGING_DIC = {}
        -- 加载配置文件:logging.config.dictConfig(LOGGING_DIC) => logging.getLogger('log_name')
    
    4.2 日志级别
        NOTSET : 0  # 不设置
        DEBUG  : 10
        INFO   : 20
        WARNING: 30 # WARN = WARNING
        ERROR  : 40
        CRITICAL:50 # FATAL = CRITICAL
        
        默认级别为warning,默认打印到终端
    
    # 测试打印不同级别的log
    import logging
    logging.debug("调试 debug")
    logging.info("信息 info")
    logging.warning("警告 warn")
    logging.error("错误 error")
    logging.critical("严重 critical")
    logging.warning("--------------------华丽分割线--------------------------")
    
    
    # 默认情况下,设置的级别为warning,所以debug和info的信息是打不出来的
    # 类型 用户 内容
    # 打印结果:
    '''
    WARNING:root:警告 warn
    ERROR:root:错误 error
    CRITICAL:root:严重 critical
    '''
    
    4.3 配置logging.basicConfig()函数
    # 为logging模块指定全局配置,针对所有logger有效,控制打印到文件中
    
    在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
    
    '''
    1) filename:指定的文件创建FiledHandler(句柄)
    2) filemode:文件打开方式,在指定了filename时会使用这个参数,默认值为'a'还可以为'w'
    3) format:指定handler使用的日志显示格式
    4) datefmt:指定日期时间格式
    5) level:设置rootlogger的日志级别
    6) stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。
        若同时列出了filename和stream两个参数,则stream参数会被忽略。
    
    '''
    
    4.4 format格式关键字
    # 格式:
        %(name)s:Logger的名字,并非用户名
        %(levelno)s:数字形式的日志级别
        %(levelname)s:文本形式的日志级别
        %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有
        %(filename)s:调用日志输出函数的模块的文件名
        %(module)s:调用日志输出函数的模块名
        %(funcName)s:调用日志输出函数的函数名
        %(lineno)d:调用日志输出函数的语句所在的代码行
        %(created)f:当前时间,用UNIX标准的表示时间的浮点数标识
        %(relativeCreated)d:输出日志信息时的,自Logger创建以来的毫秒数
        %(asctime)s:字符串形式的当前时间。默认格式是'2019-04-11 16:49:45,896'。逗号后面的是毫秒
        %(thread)d:线程ID。可能没有
        %(threadName)s:线程名。可能没有
        %(process)d:进程ID。可能没有
        %(message)s:用户输出的消息
    
    4.5 测试定制格式输出log
    import logging
    logging.basicConfig(
        filename='test.log',
        format='%(levelname)s: %(asctime)s - %(filename)s -%(module)s :  %(message)s ',
        datefmt='%Y - %m - %d %H:%M:%S',
        level=10
    )
    logging.debug("调试 debug")
    logging.info("信息 info")
    logging.warning("警告 warn")
    logging.error("错误 error")
    logging.critical("严重 critical")
    
    # -----------------------------------------------
    # 打印结果:
    # 此处由于设置了level为10,所以才能打印出了五条信息
    
    DEBUG: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 :  调试 debug 
    INFO: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 :  信息 info 
    WARNING: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 :  警告 warn 
    ERROR: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 :  错误 error 
    CRITICAL: 2019 - 04 - 11 16:05:04 - log模块.py -log模块 :  严重 critical 
    
    4.6 log文件配置
    # ------------日志的四个对象---------------
    1) logger:产生日志的对象
    2) Filter:过滤日志的对象
    3) Handler:接收日志,然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
    4) Formatter对象:可以定制不同的日志格式对象,然后给不同的Handler对象使用,以此来控制不同的Handler的日志格式
    
    # ------------详细配置过程--------------------
    
    import logging
    
    # 1.logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
    logger = logging.getLogger(__file__)
    
    
    # 2.Filter对象:不常用
    
    
    # 3.Handler对象:接收logger传来的日志,然后控制输出
    h1 = logging.FileHandler('t1.log')  # 打印到文件
    h2 = logging.FileHandler('t2.log')  # 打印到文件
    h3 = logging.StreamHandler()  # 打印到终端
    
    
    # 4.Formatter对象:日志格式
    formater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                                  datefmt='%Y-%m-%d %H:%M:%S %p')
    formater2 = logging.Formatter('%(asctime)s :  %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p')
    formater3 = logging.Formatter('%(%(name)s :  %(message)s')
    
    
    # 5.为Handler对象绑定格式
    h1.setFormatter(formater1)
    h2.setFormatter(formater2)
    h3.setFormatter(formater3)
    
    
    # 6.将Handler添加给logger并设置日志级别
    logger.addHandler(h1)
    logger.addHandler(h2)
    logger.addHandler(h3)
    logger.setLevel(10)
    
    
    #7、测试
    logger.debug('debug')
    logger.info('info')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')
    
    
    4.7 常用模板
    import logging
    
    # 其中name为getlogger指定的名字
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]'
    
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    logfile_path = "配置文件路径"
    
    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',  # 日志文件的编码
            },
        },
        'loggers': {
            # logging.getLogger(__name__)拿到的logger配置
            'aa': {
                'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    
    

    5.项目开发结构

    --ATM
        --bin  : 存放可执行文件,项目的入口
        --conf :存放项目的配置信息
        --core :存放项目的核心代码
        --db   :数据处理相关的代码
        --lib  :库,存放公共模块
        --log  :日志文件
    
  • 相关阅读:
    Elasticsearch集成IKAnalyzer分析器
    Elasticsearch操作Document文档
    ElasticSearch简介
    Lucene查询索引
    Lucene索引维护(添加、修改、删除)
    Lucene使用IKAnalyzer分词
    Lucene搜索引擎入门
    MySQL优化(四)——读写分离
    MySQL优化(三)——主从复制
    Java 身份证验证工具类代码模板
  • 原文地址:https://www.cnblogs.com/xt12321/p/10692403.html
Copyright © 2020-2023  润新知