配置是开发中常用的手段,通过配置可以灵活的设置可变的参数,而不需要调整代码。
python中有使用不同的文件格式来做配置,如json,xml等。今天这里分享一个好用的配置工具yaml文件。
首先我们来了解下yaml的文件格式。
1.yaml文件格式
- 区分大小写;
- 使用缩进表示层级关系;
- 使用空格键缩进,而非Tab键缩进
- 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
- 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
- 注释标识为#
举个例子:
network:
channel: 3
lr: le-3
dataset:
data: [1, 2, 3]
name: bsr
is_use: true
nul_val: null
another: ~
param: 12.1
alist:
- a
- b
- c
2.读取yaml文件
yaml文件是通过pyyaml包来解析的, 安装如下:
pip install pyyaml
读取文件如下:
import yaml
import os
yaml_file = './conf.yml'
with open(yaml_file, 'r', encoding="utf-8") as file:
file_data = file.read()
data = yaml.safe_load(file_data)
print(data)
print("类型:", type(data))
# {'network': {'channel': 3, 'lr': 'le-3'}, 'dataset': {'data': [1, 2, 3], 'name': 'bsr', 'is_use': True, 'nul_val': None, 'another': None, 'param': 12.1}, 'alist': ['a', 'b', 'c']}
# 类型: <class 'dict'>
由上可知,yaml文件经过解析以后是以python 字典对象存在的。通过对比yaml文件和dict数据,我们发现:
- yaml可以支持python常用的对象类型,如整形,浮点型,列表,字典, None,布尔型等
- yaml中:形成了key:value的字典映射,可以方便通过key获取
- yaml中的字符不需要额外的引号,yaml自动识别
- None可以通过null或者~来表示
- yaml文件的缩进表示层级,不同层级嵌套表示字典的不同嵌套
-
表示列表的某个元素值
是不是超级好用?
# 3
print(data.get('network').get('channel'))
# [1, 2, 3]
print(data.get('dataset').get('data'))
需要注意的是: 上面yaml文件中 lr: 1e-3
这种科学计数法并没有正确识别, 可以调整成lr: 1.0e-3
即可识别;
另外yaml中也可以进行强制类型转换(通过!!) 格式如下
test:
str_vale: !!str 1
读取str_vale为string类型
希望对你有帮助!