zoukankan      html  css  js  c++  java
  • day 14 项目目录规范; time ; logging

    import   sys

    print(sys.modules) 程序一运行,解释器将里面的所有内容全部加载到内存

    项目目录规范:

      代码不可能全部只写在一个文件,十几万行代码,调整,修改都很不方便。

      所以要将代码规范化:

        目录规范化, 具体代码规范,PEP8规范等等

      目录规范化好处?

        1、项目结构清晰,便于查找

        2、对项目修改,易于调试

    常用目录结构:

    文件夹 文件    作用

    core src      主逻辑文件

    lib commom     公共组件

    bin starts     启动文件

    conf settings     配置文件

    log access.log     日志文件

    db            数据文件,账号密码,流水等

    time,  datetime 模块 :

    time模块给咱们提供的时间有三种形式:

    第一种形式

    time.time()  时间戳,从1970-01-01 00:00:00 距今时间,计算机用

    第二种形式:格式化时间(人类使用)

    2019/01/10 10:38  strftime()

    print(time.time())   # 时间戳
    print(time.strftime('%Y/%m/%d'))     #  2019/01/08
    ft = time.strftime("%y{}%m{}%d{} %I:%M:%S ".format('', '', '')) 这样不行 
    ft = time.strftime("%y{}%m{}%d{} %I:%M:%S ").format('', '', '')

    格式化时间的多种用法

    %y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366%p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称
    %% %号本身
    
    python中时间日期格式化符号:
    
    python中时间日期格式化符号
    多种格式化时间的用法

    第三种形式:结构化时间以元组的形式存在

    作为格式化时间与时间戳进行转换

    struct_time = time.localtime()
    print(struct_time)
    # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=8, tm_hour=20, 
    # tm_min=39, tm_sec=53, tm_wday=1, tm_yday=8, tm_isdst=0)
    print(struct_time[0])  # 2019
    print(struct_time.tm_year)  # 2019

    时间戳与结构化时间之间的转换:

    # 格式化时间 ---->  结构化时间
    ft = time.strftime('%Y/%m/%d %H:%M:%S')
    st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
    print(st)
    # 结构化时间 ---> 时间戳
    t = time.mktime(st)
    print(t)
    
    # 时间戳 ----> 结构化时间
    t = time.time()
    st = time.localtime(t)
    print(st)
    # 结构化时间 ---> 格式化时间
    ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
    print(ft)
    View Code

    计算时间差:

    import time
    true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
    time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
    dif_time=time_now-true_time
    struct_time=time.gmtime(dif_time)
    print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
                                           struct_time.tm_mday-1,struct_time.tm_hour,
                                           struct_time.tm_min,struct_time.tm_sec))
    
    计算时间差
    计算时间差

    datetime模块

    import datetime
    now_time = datetime.datetime.now()
    print(now_time)  # 2019-01-08 20:46:59.857607
    # 只能调整的字段:weeks days hours minutes seconds
    print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
    print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
    print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
    print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天后
    print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小时后
    print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小时前
    print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
    print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分钟后
    print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
    print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒后
    
    current_time = datetime.datetime.now()
    # 可直接调整到指定的 年 月 日 时 分 秒 等
    
    print(current_time.replace(year=1977))  # 直接调整到1977年
    print(current_time.replace(month=1))  # 直接调整到1月份
    print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601
    
    # 将时间戳转化成时间
    print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17
    datetime

    日志:

    开发中的日志:

    1、日志帮助你调试代码

    2、代码的警告,危险提示作用

    3、你对服务器的操作命令

    4、重要的节点,需要日志提示。

    logging的,低,中,高,配

    低配:

    值打印到屏幕

    import logging
    logging.debug('debug message')  # 调试模式
    logging.info('info message')  # 正常运转模式
    logging.warning('warning message') # 警告模式  默认从这里开始打印到屏幕
    logging.error('error message')  # 错误模式
    logging.critical('critical message')  #致命的 崩溃模式
    while 1:
        try:
            num = input('>>>')
            int(num)
        except ValueError:
            logging.warning('输入非数字元素,警告!')
    低配v1
    import logging
    # 制定显示信息格式
    logging.basicConfig(
        # level=logging.DEBUG,  # 设定级别
        level=20,  # 设置级别
        format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
        # datefmt='%a, %d %b %Y %H:%M:%S',  # 显示时间格式
        # filename='test.log',
        # filemode='w'
    )
    logging.debug('debug message')  # 调试模式  10
    logging.info('info message')  # 正常运转模式  20
    logging.warning('warning message') # 警告模式  30
    logging.error('error message')  # 错误模式  40
    logging.critical('critical message')  #致命的 崩溃模式 50
    低配v2

    中配

     标配
    # 1.产生logger对象
    # logger = logging.getLogger()
    
    # # 2 产生其他对象(屏幕对象,文件对象)
    # sh = logging.StreamHandler()
    # fh1 = logging.FileHandler('staff.log', encoding='utf-8')
    # fh2 = logging.FileHandler('boss.log', encoding='utf-8')
    #
    # # 3,设置显示格式
    # formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 执行设置显示格式
    # formater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 执行设置显示格式
    # formater2 = logging.Formatter('%(asctime)s-%(message)s')  # 执行设置显示格式
    #
    # # 4,给对象绑定格式
    # sh.setFormatter(formater)
    # fh1.setFormatter(formater1)
    # fh2.setFormatter(formater2)
    #
    # # 5 给logger对象绑定其他对象
    # logger.addHandler(sh)
    # logger.addHandler(fh1)
    # logger.addHandler(fh2)
    #
    # # 6 设置显示级别
    # # 其他对象的级别要高于logger的级别
    # logger.setLevel(40)
    # sh.setLevel(20)
    # fh1.setLevel(30)
    # fh2.setLevel(50)
    #
    #
    # logging.debug('debug message')  # 调试模式  10
    # logging.info('info message')  # 正常运转模式  20
    # logging.warning('warning message') # 警告模式  30
    # logging.error('error message')  # 错误模式  40
    # logging.critical('critical message')  #致命的 崩溃模式 50
    View Code

    高配

    import os
    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'
    
    # boss版格式(lowb版)
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    
    # 定义日志输出格式 结束
    
    
    
    logfile_name = r'D:python骑士计划3期day14logstaff.log'  # log文件名
    
    # log配置字典
    
    LOGGING_DIC = {
        'version': 1,  # 版本
        'disable_existing_loggers': False,  # 可否重复使用之前的logger对象
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
            'boss_formatter':{
                'format': id_simple_format
            },
        },
        'filters': {},
        'handlers': {
            #打印到终端的日志
            'stream': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            #打印到文件的日志,收集info及以上的日志  文件句柄
            'file': {
                'level': 20,
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',  #标准
                'filename': logfile_name,  # 日志文件
                'maxBytes': 300,  # 日志大小 300 bit
                'backupCount': 5,  #轮转文件数
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        'loggers': {
            #logging.getLogger(__name__)拿到的logger配置
            '': {
                'handlers': ['stream', 'file'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',  # 总级别
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    # 字典中第一层的所有key都是固定不可变的。
    import logging
    logging.config.dictConfig(LOGGING_DIC)
    logger = logging.getLogger()  # 这个logger对象是通过自己个性化配置的logger对象
    logger.info('运转正常')
    
    
    
    # def load_my_logging_cfg():
    #     logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
    #     logger = logging.getLogger(__name__)  # 生成一个log实例
    #     logger.info('It works!')  # 记录该文件的运行状态
    #
    # if __name__ == '__main__':
    #     load_my_logging_cfg()
    View Code

     

  • 相关阅读:
    为什么linux有足够的内存还进行swap?
    vmstat命令的使用
    Windows远程服务器不能复制粘贴
    Windows可以ping通百度,但是用浏览器打不开网页
    java形式参数分别是基本类型和引用类型的调用
    Ubuntu16.04安装Python3.6 和pip
    Python2/3共存,pip2/3共存
    multiprocessing模块
    Python-进程与线程
    鼠标不能动,插上了但没反应
  • 原文地址:https://www.cnblogs.com/echo2019/p/10238432.html
Copyright © 2011-2022 走看看