在一些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
|
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() 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
| 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}')
|