Python YAML 模块使用教程:接口测试参数存储与配置

文章目录

    • 一、YAML介绍
      • [1.1 核心特点](#1.1 核心特点)
      • [1.2 支持的数据类型及语法对比(与JSON)](#1.2 支持的数据类型及语法对比(与JSON))
      • [1.3 语法辅助工具](#1.3 语法辅助工具)
    • [二、YAML 使用(Python 环境)](#二、YAML 使用(Python 环境))
      • [2.1 安装 PyYAML 库](#2.1 安装 PyYAML 库)
      • [2.2 核心操作(读取、写入、清空)](#2.2 核心操作(读取、写入、清空))
        • [2.1 追加写入 YAML 文件](#2.1 追加写入 YAML 文件)
        • [2.2 读取 YAML 文件数据](#2.2 读取 YAML 文件数据)
        • [2.3 清空 YAML 文件](#2.3 清空 YAML 文件)
      • [2.3 完整使用示例](#2.3 完整使用示例)
      • [2.4 关键说明](#2.4 关键说明)

一、YAML介绍

YAML 是一种数据序列化语言,用于以人类可读的形式存储信息。其最初代表"Yet Another Markup Language",后更改为"YAML Ain't Markup Language"(YAML 不是一种标记语言),以区别于传统标记语言。

1.1 核心特点

  • 简洁易读:语法简洁,减少 JSON、XML 中的引号、括号等"噪音"格式;
  • 非编程语言:主要用于存储配置信息,不具备编程逻辑;
  • 缩进敏感:缩进规则类似 Python,通过缩进来表示层级关系;
  • 区分大小写:对键名、值的大小写严格区分;
  • 禁用 Tab 键:不允许使用制表符缩进,需通过空格实现缩进(部分编辑器可配置 Tab 自动转为空格)。

1.2 支持的数据类型及语法对比(与JSON)

YAML 文件后缀名为 .yaml.yml(常用 .yml),支持多种数据类型,其语法与 JSON 对比如下:

数据类型 YAML 语法 JSON 语法
简单标量值 key: value {"key": "value"}
整数和浮点数 int_key: 123 float_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: - item1 - item2 - item3 {"list_key": ["item1", "item2", "item3"]}
映射(字典) map_key: sub_key1: sub_value1 sub_key2: sub_value2 {"map_key": {"sub_key1": "sub_value1", "sub_key2": "sub_value2"}}
嵌套结构 nested_key: list_key: - item1 - item2 map_key: sub_key1: sub_value1 sub_key2: sub_value2 {"nested_key": {"list_key": ["item1", "item2"], "map_key": {"sub_key1": "sub_value1", "sub_key2": "sub_value2"}}}

1.3 语法辅助工具

若对 YAML 语法不熟悉,可使用 JSON 转 YAML 工具快速生成,生成后需二次检查格式正确性。

工具地址:https://www.jashtool.com/json/to-yaml

示例:

二、YAML 使用(Python 环境)

在 Python 中使用 YAML 需借助 PyYAML 库,主要用于读取、写入、清空 YAML 配置文件,适用于接口自动化测试中的参数存储、配置管理等场景。

2.1 安装 PyYAML 库

安装命令:

python 复制代码
pip install PyYAML

安装后可通过pip list查看是否安装成功

2.2 核心操作(读取、写入、清空)

2.1 追加写入 YAML 文件

向指定 YAML 文件追加数据(若文件不存在则自动创建):

python 复制代码
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)
2.2 读取 YAML 文件数据

根据指定键读取 YAML 文件中的对应值:

python 复制代码
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]
2.3 清空 YAML 文件

清空指定 YAML 文件中的所有内容:

python 复制代码
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()

2.3 完整使用示例

python 复制代码
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()

2.4 关键说明

  • yaml.safe_dump():安全写入数据,避免执行恶意代码,推荐优先使用(而非 yaml.dump());
  • yaml.safe_load():安全加载数据,同样用于防范恶意代码,避免使用 yaml.load()(存在安全风险);
  • 文件路径:示例中默认将 YAML 文件放在项目根目录的 data 文件夹下,需确保该文件夹已创建,否则会抛出文件不存在异常;
  • 编码格式:指定 encoding="utf-8" 避免中文等特殊字符出现乱码。
相关推荐
java1234_小锋1 小时前
Python常见面试题:Python是如何进行内存管理的?
java·jvm·python
随便写个昵称2 小时前
django操作静态页面后返回提示
python·django·sqlite
所谓伊人,在水一方3332 小时前
【Python数据科学实战之路】第6章 | 高级数据可视化:从统计洞察到交互叙事
开发语言·python·信息可视化
喵手2 小时前
Python爬虫实战:降维打击 - 用 Playwright 嗅探网络层抓取douyin无水印视频!
爬虫·python·爬虫实战·抖音·playwright·零基础python爬虫教学·采集抖音无水印视频
Fuliy962 小时前
第三阶段:进化与群体智能 (Evolutionary & Swarm Intelligence)
人工智能·笔记·python·学习·算法
淘矿人2 小时前
【claude】05_Claude Skill 实战案例精选(上):开发类技能+weelinking中转服务
大数据·人工智能·python·elasticsearch·搜索引擎·cloudera
一碗烈酒2 小时前
【使用Python临时搭建代理转发服务,内网穿透】
python·测试工具·代理模式
测试19982 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试用例·接口测试·压力测试·性能测试
深耕AI2 小时前
【 从零开始的VS Code Python环境配置:uv】
开发语言·python·uv