zoukankan      html  css  js  c++  java
  • 五、配置文件yaml

    一、什么是配置文件:.ini   .conf    .cfg
    在一个项目当中,对项目进行配置(设置)的一些数据在项目运行过程中,一般不会变化。对于不同的项目和环节,可能需要变化
     
    二、为什么要做配置文件
    将所有的代码和配置都变成模块化可配置化,这样就提高了代码的重用性,不用每次都去修改代码内部,这就是我们逐步要做的事情
    场景举例:
    1)多处地方需要用同一个参数,这个时候最好是配置化,这样改动一处就可以
    2)如果是经常变化的变量,我们也可以做这个配置--与参数化要区分开来
     
    三、yaml文件格式
    log:
        name: 'python29'
        file: 'python20log.txt'
        logger_level: 'DEBUG'
        file_level: 'DEBUG'
        stream_level: 'DEBUG'
    mysql:
        port: 3306
        db_name: 'demo'
    excel:
        file: 'cases.xlsx'

    1) yaml文件规则

    * 区分大小写;

    * 使用缩进表示层级关系;

    * 使用空格键缩进,而非Tab键缩进

    * 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;

    * 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;

    * 注释标识为#

    * 冒号后空一行,字符串可以加引号,可以不加引号

    * 新建file文件,命名xx.yaml或者xx.yml

    2) yaml文件数据结构

    * 字典:键值对的集合
                键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
    log:
        name: 'zjx'
        file: 'zjxlog.txt'
        logger_level: 'DEBUG'
        file_level: 'DEBUG'
        stream_level: 'DEBUG'
    * 列表:一组按序排列的值
                数组前加有 “-” 符号,符号与值之间需用空格分隔
    teachers:
      - nini
      - huahua
      - panpan

    * 字符串:可以加引号,也可以不加

    log:
        name: zjx
        file: 'zjxlog.txt'

    * 数字:加引号就是字符串,不加就是int

    demo:
      age1: 16
      age2: "18"

    四、yaml文件使用

    1)安装yaml模块
    cmd命令:pip install yaml
     
    2)新建.yaml文件
    右键-->new-->file,输入name以.yml或.yaml结尾即可
     

    3)读取yaml文件数据

    取yaml文件,返回的值是个字典

    import yaml
    
    with open('config.yaml','r',encoding='utf=8') as f:
        conf = yaml.load(f,Loader=yaml.SafeLoader)
        print(conf)

     

    4)文件写入:yaml.dump(一般情况不使用)

    # 写入yaml
    with open('another.yaml','w',encoding='utf-8') as f:
        yaml.dump({'log':'logdemo'},f)

    五、封装  yaml_handler

    import yaml
    
    # 封装读取和写入yaml文件
    def read_yaml(file):
        '''读取yaml文件'''
        with open(file, 'r', encoding='utf=8') as f:
            conf = yaml.load(f, Loader=yaml.SafeLoader)
        return conf
    
    def write_yaml(file,data):
        '''写入yaml文件'''
        with open(file, 'w', encoding='utf-8') as f:
            yaml.dump(data, f)

    六、读取yaml文件到log封装

    import logging
    import yaml
    
    # 封装读取和写入yaml文件
    def read_yaml(file):
        '''读取yaml文件'''
        with open(file, 'r', encoding='utf=8') as f:
            conf = yaml.load(f, Loader=yaml.SafeLoader)
        return conf
    
    def write_yaml(file,data):
        '''写入yaml文件'''
        with open(file, 'w', encoding='utf-8') as f:
            yaml.dump(data, f)
    
    # 获取所有配置项
    config = read_yaml('config.yaml')
    log_config = config['log']
    
    # 封装日志
    def get_logger(
            name = log_config['name'],
            file = log_config['file'],
            logger_level = log_config['logger_level'],
            file_level = log_config['file_level'],
            stream_level = log_config['stream_level']
    ):
        '''获取收集器'''
        logger = logging.getLogger(name)
        # 设置收集器级别
        logger.setLevel(logger_level)
    
        # 设置输入管理器
        stream_handler = logging.StreamHandler()
        stream_handler.setLevel(stream_level)
        logger.addHandler(stream_handler)
    
        # 设置格式
        fmt_value = '%(asctime)s--%(filename)s--%(lineno)d--%(levelname)s--%(message)s'
        fmt = logging.Formatter(fmt_value)
        stream_handler.setFormatter(fmt)
    
        if file:
            file_handler = logging.FileHandler(file, encoding='utf-8')
            file_handler.setLevel(file_level)
            logger.addHandler(file_handler)
            file_handler.setFormatter(fmt)
    
        return logger
    
    # 运行
    if __name__ == '__main__':
        logger = get_logger(file='log.txt')
        logger.info('hello')
        logger.warning('警告')
  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13680848.html
Copyright © 2011-2022 走看看