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