在一些python脚本常常会用到yml(yaml)文件去加载相关配置,那么我们也可以用yml文件储存可变的参数信息进而可拓展的动态加载可执行内容。这样可以大大增加可拓展型和维护性。


yaml文件

yaml是一种标记语言,其语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • ‘#’表示注释
  • - 开头的行表示构成一个数组,取消 - 表示构成一个字典

yaml的对象对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。也可以使用 **key:{key1: value1, key2: value2, …}**。但更为常用的是使用缩进表示层级关系。

例如一下例子:要严格注意缩进

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# @name: exmple.yaml
# @Author: recyvan
# @Date: 2024-4-1
# @information: exmple
libray:
- num1: fire
- num2: requests
url:
headers: "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
meth:
menthod: GET
params:
- key1: a=index.html
- key2: b=index.py
cmd:
com: dir

通过上述yaml文件可以了解到该文件的创建作者,时间,对象信息,参数,子参数等内容。

python库-yaml

那么创建好了简单的yaml文件,如何用python动态加载呢?这里使用到了python的一个库–yaml库来解析文件。安装方式: pip install PyYaml。

读取yaml文件数据

1
2
3
4
5
6
7
8
9
import yaml

file_yml = "./exmple.yaml"
fp=open(file_yml,'r',encoding='utf-8')
rf=fp.read()
fp.close()
#tream=rf表示要加载的YAML文件的流(stream),Loader=yaml.FullLoader指定了YAML文件的加载器(loader)
ymlone = yaml.load(stream=rf,Loader=yaml.FullLoader)
print(ymlone)

内容将以字典的方式返回:

样例一

读取yml指定参数

在这个示例中,我们首先使用yaml.load()函数加载YAML文件,并将其解析为Python对象。然后,我们使用data.get('param_name')来获取特定参数的值

1
2
3
4
5
6
7
8
9
import yaml

file_yml = "./exmple.yaml"
with open(file_yml,'r',encoding='utf-8') as fp:
data = yaml.load(fp, Loader=yaml.FullLoader)
# 获取特定参数的值
param_value = data.get('cmd')
# 打印参数值
print("参数值:", param_value)

结果如下:

样例二

那如果是yml中的字典和列表呢?其实可以指定其参数进行获取:

1
2
3
4
5
6
7
8
9
import yaml

file_yml = "./exmple.yaml"
with open(file_yml,'r',encoding='utf-8') as fp:
data = yaml.load(fp, Loader=yaml.FullLoader)
# 获取字典中的特定值
desired_value = data.get('param_dict').get('key2')
# 获取列表中的特定值
desired_value = data.get('param_list')[1]

我们可以通过keys关键字获取所有键的列表:

1
2
3
4
5
6
7
8
9
10
# 解析yaml文件
data = yaml.safe-load(data)
# 获取所有键
desired_value = data['param_dict'].keys()
#获取键的数量
num_keys = len(desired_value)
#遍历键的列表
for key in desired_value:
value = data['param_dict'][key]
print(f'键: {key},值: {value}')