一、什么是配置文件:.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.loadf,Loader=yaml.SafeLoader) printconf)
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_yamlfile): '''读取yaml文件''' with openfile, 'r', encoding='utf=8') as f: conf = yaml.loadf, Loader=yaml.SafeLoader) return conf def write_yamlfile,data): '''写入yaml文件''' with openfile, 'w', encoding='utf-8') as f: yaml.dumpdata, f)
六、读取yaml文件到log封装
import logging import yaml # 封装读取和写入yaml文件 def read_yamlfile): '''读取yaml文件''' with openfile, 'r', encoding='utf=8') as f: conf = yaml.loadf, Loader=yaml.SafeLoader) return conf def write_yamlfile,data): '''写入yaml文件''' with openfile, 'w', encoding='utf-8') as f: yaml.dumpdata, 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.getLoggername) # 设置收集器级别 logger.setLevellogger_level) # 设置输入管理器 stream_handler = logging.StreamHandler) stream_handler.setLevelstream_level) logger.addHandlerstream_handler) # 设置格式 fmt_value = '%asctime)s--%filename)s--%lineno)d--%levelname)s--%message)s' fmt = logging.Formatterfmt_value) stream_handler.setFormatterfmt) if file: file_handler = logging.FileHandlerfile, encoding='utf-8') file_handler.setLevelfile_level) logger.addHandlerfile_handler) file_handler.setFormatterfmt) return logger # 运行 if __name__ == '__main__': logger = get_loggerfile='log.txt') logger.info'hello') logger.warning'警告')