簡介
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)
