文章目录
- 依赖库
pip install PyYAML
- 基本语法
- 使用缩进分级,需使用空格缩进
- ‘#’ 表示注释
- 大小写敏感
- ‘-’ 开头会被转为list
- 包含’:’ 转换为字典
- 单引号内容按照字符串输出,双引号内容遇到转义字符会转换
- ‘!!type’ e.g. ‘!!int’ 强制类型转换
- 基本用法
- load 加载
import yaml
with open(file, 'r') as f:
data = f.read()
cfg = yaml.load(document)
# cfg = yaml.safe_load(document)
- dump保存
import yaml
with open('cfg.yaml') as f:
f.write(yaml.dump(cfg))
- & * aliases 别名
args1: &a
name: n1
args2: *a
# <<: *a 表示合并到当前数据
- tag
- 使用需求
-
合并多个yaml(字典-多层嵌套)
-
argparse 传入的列表参数变为字典
def list2dict(l: list):
"""将list 中数据变为dict 可能有嵌套字典
:param l: 列表
:return: d: 字典
"""
d = {}
assert len(l) % 2 == 0
keys = l[::2]
values = l[1::2]
for i, key in enumerate(keys):
dd = {}
ks = key.split('.')
dd[ks[-1]] = values[i]
for j in range(len(ks)-2, -1, -1):
dd = {ks[j]: dd}
d.update(dd)
return d
def merge_dict(dicts: list):
"""融合多个字典 包括嵌套字典
:param dicts: 字典列表
:return: d_res: 一个字典
"""
d_res = {}
for d in dicts:
for k1, v1 in d.items():
if isinstance(v1, dict):
v1 = merge_dict([d_res.get(k1, {}), v1])
d_res[k1] = v1
return d_res
if __name__ == '__main__':
# 测试 list2dict
if 0:
l = ['a.c.d', '1', 'b.e', 2]
d = list2dict(l)
print(d)
# 测试字典合并 merge_dict
if 0:
d1 = {'a': 1, 'e': {'f': 4}}
d2 = {'a': 11, 'b': 2, 'e': {'g': 54}}
d3 = {'c': 3, 'e': {'f': 44, 'g': 5}}
d = [d1, d2, d3]
d_res = merge_dict(d)
print(d_res)