YAML 简介
YAML 是一种数据序列化语言,专门用于以人类可读的形式存储信息。它的名字最初代表 "Yet Another Markup Language",后来改为 "YAML Ain't Markup Language"(YAML 不是一种标记语言),以此区别于传统的标记语言。
核心特点
- 简洁易读:语法简洁,减少了 JSON、XML 中大量的引号、括号等格式噪音;
- 非编程语言:主要用于存储配置信息,不具备编程逻辑;
- 缩进敏感:缩进规则类似 Python,通过缩进来表示层级关系;
- 区分大小写:对键名、值的大小写严格区分;
- 禁用 Tab 键:不允许使用制表符缩进,需通过空格实现(部分编辑器可配置 Tab 自动转为空格)。
数据类型及语法对比
YAML 文件后缀名为 .yaml 或 .yml,支持多种数据类型。其语法与 JSON 的对比如下:
| 数据类型 | YAML 语法 | JSON 语法 |
|---|---|---|
| 简单标量值 | key: value | {"key": "value"} |
| 整数和浮点数 | int_key: 123\nfloat_key: 123.456 | {"int_key": 123, "float_key": 123.456} |
| 布尔值 | bool_key: true | {"bool_key": true} |
| 字符串 | string_key: "This is a string" | {"string_key": "This is a string"} |
| 列表 | list_key:\n- item1\n- item2\n- item3 | {"list_key": ["item1", "item2", "item3"]} |
| 映射(字典) | map_key:\nsub_key1: sub_value1\nsub_key2: sub_value2 | {"map_key": {"sub_key1": "sub_value1", "sub_key2": "sub_value2"}} |
| 嵌套结构 | nested_key:\nlist_key:\n- item1\n- item2\nmap_key:\nsub_key1: sub_value1\nsub_key2: sub_value2 | {"nested_key": {"list_key": ["item1", "item2"], "map_key": {"sub_key1": "sub_value1", "sub_key2": "sub_value2"}}} |
Python 环境下的使用
在 Python 中使用 YAML 需借助 PyYAML 库,主要用于读取、写入、清空 YAML 配置文件,适用于接口自动化测试中的参数存储、配置管理等场景。
安装 PyYAML 库
pip install PyYAML
安装后可通过 pip list 查看是否安装成功。
核心操作(读取、写入、清空)
追加写入 YAML 文件
向指定 YAML 文件追加数据(若文件不存在则自动创建)。这里要注意路径拼接和安全写入:
import yaml
import os
def write_yaml(filename, data):
# 拼接文件路径(默认在项目根目录的 data 文件夹下)
file_path = os.getcwd() + "/data/" + filename
# 以追加模式打开文件,指定编码为 utf-8
with open(file_path, encoding="utf-8", mode="a+") as f:
# 安全写入数据,支持 Unicode 字符
yaml.safe_dump(data, stream=f, allow_unicode=True)
读取 YAML 文件数据
根据指定键读取 YAML 文件中的对应值。加载时务必使用 safe_load 防止反序列化漏洞:
import yaml
import os
def read_yaml(filename, key):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="r") as f:
# 安全加载 YAML 数据
data = yaml.safe_load(f)
# 返回指定键对应的值
return data[key]
清空 YAML 文件
清空指定 YAML 文件中的所有内容,通常用于重置测试数据:
import os
def clear_yaml(filename):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="w") as f:
# 清空文件内容
f.truncate()
完整使用示例
下面是一个完整的测试流程,演示了如何写入、读取并清理 YAML 文件:
import yaml
import os
# 追加写入
def write_yaml(filename, data):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="a+") as f:
yaml.safe_dump(data, stream=f, allow_unicode=True)
# 读取
def read_yaml(filename, key):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="r") as f:
data = yaml.safe_load(f)
return data[key]
# 清空
def clear_yaml(filename):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="w") as f:
f.truncate()
# 测试函数
def test_yml():
# 1. 写入 YAML 文件(数据为字典类型)
data = {"str": "12345", "user": "zhangsan", "password": "123456"}
write_yaml('test.yml', data)
# 2. 读取 YAML 文件中 "str" 键对应的值
ret = read_yaml('test.yml', "str")
print("读取结果:", ret)
# 输出:读取结果:12345
# 3. 清空 YAML 文件
clear_yaml('test.yml')
# 执行测试
if __name__ == "__main__":
test_yml()
关键说明
- 安全写入:
yaml.safe_dump()是推荐的安全写入方式,避免执行恶意代码,优先于yaml.dump(); - 安全加载:
yaml.safe_load()同样用于防范恶意代码,严禁在生产环境中直接使用yaml.load(); - 文件路径:示例中默认将 YAML 文件放在项目根目录的
data文件夹下,需确保该文件夹已创建,否则会抛出文件不存在异常; - 编码格式:指定
encoding="utf-8"避免中文等特殊字符出现乱码。

