一、什么是配置文件:.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('警告')