首页/文章/ 详情

听说python中的yaml模块很适合做参数管理?

1年前浏览421

开发中你是怎么管理项目中的参数的呢?

此前写代码,有很多全局性的变量,比如路径、名称、参数之类的,我总是爱专门创建个config.py文件,在里面去记录。然后在别的脚本中需要用到这里面的参数的时候,只需要将config.py文件作为模块import进来,即可直接拿着用,一直都觉得用着挺爽。直到最近才了解到,真正的pythoner都是用yaml文件来管理参数的,忍不住要探索一二。

网上介绍文档挺多的,这里摘抄一篇(原文链接见文末),就当是学习过了。

如下。



一、yaml文件介绍


yaml是一个专门用来写配置文件的语言。

1. yaml文件规则
  • 区分大小写;

  • 使用缩进表示层级关系;

  • 使用空格键缩进,而非Tab键缩进

  • 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;

  • 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;

  • 注释标识为#


2. yaml文件数据结构
  • 对象:键值对的集 合(简称 "映射或字典")
    键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔

  • 数组:一组按序排列的值(简称 "序列或列表")
    数组前加有 “-” 符号,符号与值之间需用空格分隔

  • 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
    None值可用null或者~表示


二、python中读取yaml配置文件


1、前提条件:

python中读取yaml文件前需要安装pyyaml和导入yaml模块。

使用yaml需要安装的模块为pyyaml,在命令行使用如下指令来进行安装。


pip3 install pyyaml


使用时,导入的模块为yaml。


import yaml


2. 读取yaml文件数据

为了方便演示,我们先创建一个名为config.yaml的文件,文件内写入如下内容。

然后,用python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;


















# get_yaml_data.pyimport yamldef get_yaml_data(yaml_file):# 打开yaml文件    print("***获取yaml文件数据***")with open(yaml_file, 'r', encoding="utf-8") as f:        file_data = f.read()    print(file_data)    print("类型:", type(file_data))
# 将字符串转化为字典或列表    print("***转化yaml数据为字典或列表***")    data = yaml.load(file_data, Loader=yaml.FullLoader)    print(data)    print("类型:", type(data))return dataget_yaml_data("./config.yaml")


运行上述代码的结果如下:

这样就完成了最基础的yaml文件读取,并把它转化成了python支持的列表或者字典,就很方便后续拿到指定变量的参数了。

接下来,进行一些yaml格式的探索,看看python读进来,是什么效果。


3. yaml文件数据为键值对

(1)yaml文件中内容为“键值对“





# yaml键值对:即python中字典usr: mypsw: 123455s: " abc\n"

python解析yaml文件后获取的数据:


{'usr': 'my', 'psw': 123455, 's': ' abc\n'}


大概可以看出来,yaml文件中字符串不需要写单引号或者双引号,python也能自动识别字符串,且统一为单引号。

(2)yaml文件中内容为“键值对'嵌套"键值对"








# yaml键值对嵌套:即python中字典嵌套字典usr1:    name: a    psw: 123usr2:    name: b    psw: 456

python解析yaml文件后获取的数据:


{'usr1': {'name': 'a', 'psw': 123}, 'usr2': {'name': 'b', 'psw': 456}}


(3)yaml文件中“键值对”中嵌套“数组”








# yaml键值对中嵌套数组usr3:  - a  - b  - cusr4:  - b


python解析yaml文件后获取的数据:


{'usr3': ['a', 'b', 'c'], 'usr4': ['b']}


4. yaml文件数据为数组

(1)yaml文件中内容为数组





# yaml数组- a- b- 5

python解析yaml文件后获取的数据:


['a', 'b', 5]


(2)yaml文件“数组”中嵌套“键值对”






# yaml"数组"中嵌套"键值对"- usr1: aaa- psw1: 111  usr2: bbb  psw2: 222


python解析yaml文件后获取的数据:


[{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]


5. yaml文件中基本数据类型:










# 纯量s_val: name             # 字符串:{'s_val''name'}spec_s_val: "name\n"    # 特殊字符串:{'spec_s_val': 'name\n'num_val: 31.14          # 数字:{'num_val': 31.14}bol_val: true           # 布尔值:{'bol_val': True}nul_val: null           # null值:{'nul_val': None}nul_val1: ~             # null值:{'nul_val1': None}time_val: 2018-03-01t11:33:22.55-06:00     # 时间值:{'time_val': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)}date_val: 2019-01-10    # 日期值:{'date_val': datetime.date(2019, 1, 10)}


6. yaml文件中的锚点与引用
当yaml文件中出现多个重复内容时,可以通过 锚点【& 】与引用【*】 ,实现引用锚点处内容的功能,从而在修改时,只需要修改锚点处的内容,即可在所有引用处生效。

yaml文件中内容:







animal: &animal3 fishtest: *animal3
ID: &id 23ID2: *idID3: *id

python解析yaml文件后获取的数据:


{'animal': 'fish', 'test': 'fish', 'ID': 23, 'ID2': 23, 'ID3': 23}

简单来说就是用【&参数名 参数值】的方式来定义一个变量,然后用【*参数名】来获得参数的值。


本文完。


来源:车路慢慢
python
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-22
最近编辑:1年前
李慢慢
硕士 自动驾驶仿真工程师一枚
获赞 11粉丝 70文章 122课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈