pyyaml使用记录

文章目录

参考知乎
官方文档


  1. 依赖库
    pip install PyYAML

  1. 基本语法
  • 使用缩进分级,需使用空格缩进
  • ‘#’ 表示注释
  • 大小写敏感
  • ‘-’ 开头会被转为list
  • 包含’:’ 转换为字典
  • 单引号内容按照字符串输出,双引号内容遇到转义字符会转换
  • ‘!!type’ e.g. ‘!!int’ 强制类型转换

  1. 基本用法
  • 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
    在这里插入图片描述

  1. 使用需求
  • 合并多个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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值