• 4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块


    4 Apr 18
    上节课复习:函数在一个程序内被使用,模块可以被几个程序共享使用
    一、软件开发目录
    confàsettings.py
    core(主要逻辑)àsrc.py
    dbàdb.txt
    lib(库)àcommon.py
    bin(入口,启动)àstart.py
    logàaccess.log
    readme(说明书)
     
    二、logging模块的使用
    日志分为五个级别:debug 10, info 20, warning 30, error 40, critical 50
    若日志级别设为10,包括10以上的所以日志都可打印
    logging模块有四个对象:
    logger:负责产生日志
    filter: 过滤日志(不常用)
    handler:控制日志输出的目标:打印到文件或终端
    formatter: 输出格式 
     
    logging的配置文件
    """
    logging配置
    """
     
    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'
     
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
     
    # 定义日志输出格式 结束
     
    logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
     
    logfile_name = 'all2.log'  # log文件名
     
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
        os.mkdir(logfile_dir)
     
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)
     
    # 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)传递
            },
        },
    }
     
     
    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()
     
    三、序列化
    序列化:内存中的数据结构----》转成一种中间格式(字符串)----》存到文件中
    dic={'name':'egon','age':18}
    with open('db.txt','w',encoding='utf-8') as f:
        f.write(str(dic))
     
    反序列化:文件----》读取中间格式(字符串)------》eval转成内存中数据结构
    #注意:eval不是用来反序列化的,它是把字符串中的东西取出来
    with open('db.txt','r',encoding='utf-8') as f:
        data=f.read()
        dic=eval(data)
        print(dic,type(dic))
     
    l=[1,True,None,False]
    x=str(l) # "[1,True,None,False]"
    import json
    x="[null,true,false,1]"
     
    res=json.loads(x)
     
    print(res,type(res))
     
    序列化反序列化--------------------》json.dumps,json.loads
    #json的跨平台型好,但仅能识别几种常用的数据类型;将数据转成str存进硬盘
    import json
    序列化:内存中的数据结构----》转成一种中间格式(字符串)----》存到文件中
    dic={'name':'egon','age':18}
     
    res=json.dumps(dic) # json格式全都是双引号
    print(res,type(res))
     
    with open('db.json','wb') as f:
        f.write(res.encode('utf-8'))
     
     
    反序列化:文件----》读取中间格式(字符串)------》eval转成内存中数据结构
    with open('db.json','r',encoding='utf-8') as f:
        data=f.read()
        dic=json.loads(data)
        print(dic,type(dic),dic['name'])
     
     
    验证json格式全都为双引号
    with open('db.txt','r',encoding='utf-8') as f:
        data=f.read()
        dic=json.loads(data)
        print(dic,type(dic),dic['name'])
     
    序列化反序列化--------------------》json.dump,json.load
    import json
    dic={'name':'egon','age':18}
     
    with open('db1.json','wt',encoding='utf-8') as f:
        json.dump(dic,f)
     
    with open('db1.json','rt',encoding='utf-8') as f:
        dic=json.load(f)
        print(dic['name'])
     
    =-==============================pickle序列化
    #pickle可识别各种数据,但只针对python,跨平台性差,将数据转成bytes存进硬盘
    import pickle
    序列化
    s={1,2,3,4,}
    res=pickle.dumps(s)
    print(res,type(res))
     
    with open('db.pkl','wb') as f:
        f.write(res)
     
    反序列化
    with open('db.pkl','rb') as f:
        data=f.read()
        print(data)
        s=pickle.loads(data)
        print(s,type(s))
     
     
    dump与load
    import pickle
    s={1,2,3}
    with open('db1.pkl','wb') as f:
        pickle.dump(s,f)
     
    with open('db1.pkl','rb') as f:
        s=pickle.load(f)
        print(s,type(s))
     
    四、os模块
    os.system #如果正常运行返回0,不正常运行返回非0,拿不到结果,只是把结果打到终端
    #重点掌握os.path系列
    其中,优先掌握
    print(os.path.dirname(r'C:acd.txt'))
    print(os.path.basename(r'C:acd.txt'))
     
    os.path.exists只管路径是否存在,不区分文件还是文件夹
    print(os.path.exists(r'D:codeSH_fullstack_s1day15下午json.py'))
    print(os.path.exists(r'D:codeSH_fullstack_s1day15'))
     
    os.path.isfile如果path是一个存在的文件,返回True。否则返回False
    print(os.path.isfile(r'D:codeSH_fullstack_s1day15下午'))
     
    os.path.isdir 存在的文件夹
     
    print(os.path.join('C:\','a','b','a.txt'))
    print(os.path.join('C:\','a','D:\','b','a.txt'))
     
    print(os.path.join('a','b','a.txt'))
     
    res=os.path.getsize(r'D:codeSH_fullstack_s1day15上午settings.py') # 单位是字节
    print(res)
  • 相关阅读:
    1. shiro-用户认证
    Salt 盐值
    使用ajax向后台发送请求跳转页面无效的原因
    @RequestParam和@RequestBody的区别
    JavaSE:Java11的新特性
    JavaSE: Java10的新特性
    JavaSE:Java9 新特性
    JavaSE:Java8新特性
    JavaSE:Java8新特性
    JavaSE:Java8 新特性
  • 原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180404.html
Copyright © 2020-2023  润新知