yaml自定义与读取
Posted sayiqiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yaml自定义与读取相关的知识,希望对你有一定的参考价值。
简介
yaml[?j?m?l]: Yet Another Markup Language。yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,看了yaml后,发现这个更直观,更方便,有点类似于json格式
基本语法:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用tab键,只能使用空格
- 缩进的空格数目不重要,只要相同层级的元素左对齐即可
- ‘#‘ 表示注释,与python类似
支持的数据结构:
- 对象: 键值对的集合,又称字典
- 数组: 列表/序列
- 纯量: 单个的、不可再分的值。字符串、布尔值、整数、浮点数
安装
pip instal pyyaml
键值对(dict)
# python
{
"user": "admin",
"pwd": "123456",
}
# yaml
user: admin
pwd: 123456
字典嵌套字典
# python
"nb1":{
"user": "admin",
"pwd": "123456",
}
# yaml
nb1:
user: admin
pwd: 123456
序列
yaml里面写一个数组,前面加一个‘-‘符号
- admin1: 123
- admin2: 345
纯量
- int/float:
n1: 12.30
- bool:
n2: true
- None:
n4: ~
- 强制转换类型:
n6: !!str 123
, int->str
混合使用
- list嵌套dict
# yaml
- user: admin1
pwd: '123'
- user: admin2
pwd: '234'
- user: admin3
pwd: '413'
用python读出来的结果
[
{'user': 'admin1', 'pwd': '123'},
{'user': 'admin2', 'pwd': '234'},
{'user': 'admin3', 'pwd': '413'}
]
yaml.load()出现警告的解决办法
Warning: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载??器(FullLoader)禁止执行任意函数,该load函数也变得更加安全
e.g.
yaml.load(input, Loader=yaml.FullLoader)
实际应用例子
有一个yaml配置文件,希望能让用户自定义神经网络,而不是使用完整的task_list,并且对于这些自定义的网络,也采用自定义的数据类型进行量化
# test.aml
caffe_models:
- imagenet
- mobilenet_v2
- resnet50
- inception_v3
- imagenet
- yolo_v2
- alexnet
- squeezenet_v1.0
- lenet
- mobilenet
dtype_list:
- asymmetric_quantized-u8
大概的思路:
import yaml
import os
yaml_path = os.path.join('test.aml')
f = open(yaml_path, 'r', encoding="utf-8")
cfg = f.read()
content = yaml.load(cfg, Loader=yaml.FullLoader)
task_list = []
for key in content:
if key == "caffe_models":
for value in content[key]:
task = (key, value)
task_list.append(task)
print('#'*100)
print(task_list)
以上是关于yaml自定义与读取的主要内容,如果未能解决你的问题,请参考以下文章