YAML 数据格式详解

在这里插入图片描述

1. YAML 概念

YAML (YAML Ain’t Markup Language) 是一种人性化的数据序列化格式:

  • 专注于数据而非标记(与 XML 不同)
  • 使用简洁的语法表示复杂数据结构
  • 可读性高,适合人类编写和阅读
  • 广泛应用于配置文件(如 Docker Compose, Ansible, Kubernetes)

2. YAML 核心原理

  • 缩进表示层级:类似 Python,使用空格缩进
  • 最小化符号:避免引号、括号等干扰符号
  • 数据类型推断:自动识别数字、布尔值等类型
  • 锚点与引用:支持数据复用(& 定义锚点,* 引用)
  • 多文档支持:单个文件可包含多个文档(用 --- 分隔)

3. YAML 语法规范

基本结构

# 注释以 # 开头
server: web01  # 键值对
ports:- 80        # 列表项- 443
environment: production
config:max_connections: 1000  # 嵌套对象timeout: 30

核心语法规则

  1. 缩进规则
    • 使用空格(不能使用 Tab)
    • 同一层级缩进必须一致
  2. 数据类型
    • 字符串:可加引号也可不加(除非有特殊字符)
    • 数字:整数(42)、浮点数(3.14
    • 布尔值:true/falseyes/no
    • 空值:null~
    • 日期:2023-11-15(ISO 8601 格式)
  3. 数据结构
    • 列表(数组):使用 - 开头
    • 对象(字典):使用 key: value 格式
  4. 多行文本
    description: |这是多行文本保留所有换行符summary: >这是折叠文本会合并为单行
    
  5. 特殊语法
    • 锚点 &name 和引用 *name
    • 合并 <<: *name(合并映射)

4. Python YAML API (PyYAML)

安装

pip install pyyaml

核心功能

函数功能主要参数
yaml.safe_load()安全解析 YAMLstream(文件或字符串)
yaml.load()解析 YAML(不安全)stream, Loader
yaml.safe_dump()安全序列化为 YAMLdata, stream, indent
yaml.dump()序列化为 YAMLdata, default_flow_style

关键参数

  • dump/dump_all
    • indent:缩进空格数
    • default_flow_style:是否使用流式风格(默认 False)
    • allow_unicode:是否允许 Unicode 字符
    • sort_keys:是否按键排序
  • load/load_all
    • Loader:指定加载器(推荐 yaml.SafeLoader

5. YAML 处理流程

yaml.dump
yaml.safe_load
yaml.dump
yaml.safe_load
yaml.dump_all
yaml.safe_load_all
Python对象
YAML字符串
Python对象
YAML文件
多文档数据
多文档YAML

6. 应用示例

示例1:基本读写

输入 (Python对象):

data = {"server": "web01","ports": [80, 443],"environment": "production","backup": True,"config": {"max_connections": 1000,"timeout": 30.5}
}

序列化 (Python → YAML):

import yaml# 转换为YAML字符串
yaml_str = yaml.dump(data, indent=2)
print(yaml_str)

输出 (YAML字符串):

server: web01
ports:
- 80
- 443
environment: production
backup: true
config:max_connections: 1000timeout: 30.5

反序列化 (YAML → Python):

# 从YAML字符串转换回Python对象
loaded_data = yaml.safe_load(yaml_str)
print(loaded_data["ports"][0])  # 输出: 80

示例2:文件操作

写入YAML文件:

config = {"database": {"host": "db.example.com","port": 3306,"user": "admin","password": "secret"},"logging": {"level": "debug","path": "/var/log/app.log"}
}with open("config.yaml", "w") as f:yaml.dump(config, f, indent=4, default_flow_style=False)

生成的config.yaml:

database:host: db.example.comport: 3306user: adminpassword: secret
logging:level: debugpath: /var/log/app.log

读取YAML文件:

with open("config.yaml", "r") as f:loaded_config = yaml.safe_load(f)print(loaded_config["database"]["host"])  # 输出: db.example.com

示例3:复杂结构处理

YAML输入 (network.yaml):

network:devices:- name: router01interfaces:- name: Gig0/0ip: 192.168.1.1mask: 255.255.255.0- name: Gig0/1ip: 10.0.0.1mask: 255.255.255.252ospf:enabled: trueareas: [0, 1]- name: switch01vlan:default: 1enabled: yes

Python解析代码:

import yamlwith open("network.yaml") as f:data = yaml.safe_load(f)for device in data["network"]["devices"]:print(f"设备: {device['name']}")if "interfaces" in device:for interface in device["interfaces"]:print(f"  接口: {interface['name']}, IP: {interface['ip']}")

输出:

设备: router01接口: Gig0/0, IP: 192.168.1.1接口: Gig0/1, IP: 10.0.0.1
设备: switch01

示例4:锚点与引用

YAML输入:

defaults: &defaultsadapter: postgreshost: localhostport: 5432development:<<: *defaultsdatabase: dev_dbtest:<<: *defaultsdatabase: test_db

Python解析后:

{'defaults': {'adapter': 'postgres','host': 'localhost','port': 5432},'development': {'adapter': 'postgres','host': 'localhost','port': 5432,'database': 'dev_db'},'test': {'adapter': 'postgres','host': 'localhost','port': 5432,'database': 'test_db'}
}

示例5:多文档处理

YAML输入 (multi_doc.yaml):

---
server: web01
status: active
...
---
server: db01
status: maintenance
...

Python读取多文档:

with open("multi_doc.yaml") as f:documents = list(yaml.safe_load_all(f))for doc in documents:print(f"服务器: {doc['server']}, 状态: {doc['status']}")

输出:

服务器: web01, 状态: active
服务器: db01, 状态: maintenance

7. 安全注意事项

  1. 避免使用 yaml.load():可能执行任意代码(使用 safe_load 代替)
  2. 验证来源:不要加载不可信的 YAML 文件
  3. 自定义安全加载器
    from yaml import SafeLoaderclass RestrictedLoader(SafeLoader):pass# 禁用特定标签
    RestrictedLoader.add_constructor(None, None)
    

8. 常见错误处理

# 缩进错误示例
bad_yaml = """
server: web01ports:  # 错误:不应缩进- 80
"""try:data = yaml.safe_load(bad_yaml)
except yaml.YAMLError as e:print(f"YAML解析错误: {e}")# 输出: mapping values are not allowed here

9. 最佳实践

  1. 字符串引号:当字符串包含 :# 等特殊字符时使用引号
  2. 列表缩进:列表项使用相同缩进
  3. 复杂结构:避免超过 4 层嵌套
  4. 行内风格:简单结构可使用行内风格(如 ports: [80, 443]
  5. 多文档分隔:使用 --- 分隔多个配置段
  6. 数据类型明确:对可能混淆的类型(如 yes)添加类型标签
    is_active: !!bool "yes"  # 明确指定为布尔值
    

10. YAML 与其他格式对比

特性YAMLJSONXML
可读性★★★★★★★★☆☆★★☆☆☆
简洁性★★★★★★★★★☆★☆☆☆☆
数据类型丰富基本文本为主
注释支持
锚点引用
学习曲线

总结

YAML 是自动化运维中最重要的配置文件格式之一,主要特点包括:

  • 极高的可读性和简洁性
  • 灵活的数据结构表示
  • 支持复杂嵌套和引用
  • 与脚本语言(如 Python)自然兼容
  • 广泛应用于 Ansible、Kubernetes、Docker 等工具

掌握 YAML 能帮助您高效处理各种配置管理任务,提升自动化运维效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85794.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react扩展

首先补充一下上个章节的一点结尾内容。reducer是一个纯函数&#xff0c;纯函数指的是当我们在redux里面定义了我们需要共享的对象后&#xff0c;我们是不可以对共享的对象本身进行改变的。我们在获取更新后的共享数据时&#xff0c;要去重新定义一个新的变量来获取更新后的共享…

6.获取图片灰度与缩放

目录 一、Halcon 1. 获取像素坐标以及灰度 2. 拖动缩放 3.图像缩放的实现方式 二、VS联合编程 1.获取像素坐标和灰度 2.拖动缩放 一、Halcon 1. 获取像素坐标以及灰度 *1. 获取像素坐标 * 1. get_mposition * 2. halcon窗口事件自带坐标数据 * *2. 获取像素灰度 *…

无人机+AI:革新集装箱箱号识别的智能解决方案

在现代化物流体系中&#xff0c;集装箱箱号识别是货物追踪与管理的核心环节。然而&#xff0c;传统的人工巡检或固定摄像头识别方式存在效率低、覆盖范围有限、易受环境干扰等问题&#xff0c;难以满足日益增长的物流需求。基于无人机与AI技术的集装箱箱号识别系统&#xff0c;…

一种新的参数高效微调方法-LoRI

论文&#xff1a;LoRI: Reducing Cross-Task Interference in Multi-Task Low-Rank Adaptation LoRA 具体参考 1. 引言与背景&#xff1a;为什么需要 LoRI&#xff1f; 这篇论文提出了一种新的参数高效微调&#xff08;PEFT&#xff09;方法&#xff0c;名为 LoRA with Reduce…

Go网络编程:基于TCP的网络服务端与客户端

Go 语言的 net 包为网络编程提供了简洁高效的接口。我们可以使用它快速构建 TCP 网络服务&#xff0c;如聊天服务器、RPC、微服务通信等。 一、TCP简介 TCP&#xff08;Transmission Control Protocol&#xff09;是面向连接的、可靠的传输协议&#xff0c;通信模型为客户端-服…

【StarRocks系列】架构、核心概念

目录 一、架构&#xff1a;分布式 MPP 列式存储 向量化引擎 二、存储&#xff1a;高性能列式存储引擎 三、表设计&#xff1a;三类模型适配不同场景 四、数据写入&#xff1a;多种方式支持实时与批量 五、数据读取&#xff1a;极致优化的查询引擎 总结&#xff1a;Star…

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…

iOS开发中的安全实践:如何通过Ipa混淆与加固确保应用安全

随着移动应用技术的不断发展&#xff0c;开发者越来越重视应用的安全性&#xff0c;尤其是iOS应用。无论是面对大规模的数据泄露问题&#xff0c;还是在应用上线后避免被逆向破解&#xff0c;开发者们都需要采取一系列技术手段来保护应用。然而&#xff0c;很多开发者在应用开发…

JAVA实战开源项目:智慧生活商城系统 (Vue+SpringBoot) 附源码

本文项目编号 T 245 &#xff0c;文末自助获取源码 \color{red}{T245&#xff0c;文末自助获取源码} T245&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

GNU Octave 基础教程(8):GNU Octave 常用数学函数

目录 一、基本算术运 二、初等数学函数 三、三角函数与反三角函数 四、统计函数 五、复数与其他函数 ✅ 小结 &#x1f51c; 下一讲预告 GNU Octave 内置了大量数学函数&#xff0c;涵盖初等数学、线性代数、复数运算、统计函数等&#xff0c;非常适合科研、工程计算使用…

Go语言中的文件与IO:JSON、CSV、XML处理

在数据交换与存储中&#xff0c;JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持&#xff0c;涵盖结构体映射、读写文件、编码解码等操作。 一、JSON处理&#xff08;encoding/json&#xff09; 1. 基本使用&#xff1a;结构体 <-> JSON type U…

三种语言写 MCP

参考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…

Python训练营-Day38-Dataset和Dataloader类

在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的方法。为此&#xff0c;PyTorch提供了DataLoader类&#xff0c;该类可以自动将数据集切分为多个批次batch&#xff0c;并支持多线程加载数据。此外&#xff0c;还存在Datase…

SVN上传代码

SVN&#xff08;Subversion&#xff09;是一个常用的版本控制系统&#xff0c;提供了对代码管理和协作的支持。以下是SVN常见操作&#xff08;如获取代码、上传代码、合并冲突处理等&#xff09;的命令行流程及实例&#xff1a; 1. 获取代码&#xff08;Checkout&#xff09; 在…

【appium】2.初始连接脚本配置

连接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…

FliTik翻页时钟v1.1.25.36,支持安卓TV/手机/车机+windows电脑端

FliTik翻页时钟v1.1.25.36&#xff0c;支持安卓TV/手机/车机windows电脑端 FliTik翻页时钟是一款集高颜值与强大功能于一身的全平台数字时钟工具类应用&#xff0c;支持TV、iOS、安卓、PC以及鸿蒙系统。它不仅拥有精美的翻页动画…

以AI赋能创意未来:即梦3.0与Seedance1.0Lite重磅登陆POE!

近年来&#xff0c;随着人工智能技术的不断突破&#xff0c;AI模型的应用场景也在逐渐拓宽。在这一过程中&#xff0c;如何整合和利用现有的AI技术&#xff0c;实现更为便捷的创作服务&#xff0c;成为了许多科技企业关注的焦点。近日&#xff0c;全球知名的AI模型整合平台POE正…

云计算与5G:如何利用5G网络优化云平台的性能

想象一下&#xff0c;你正在用手机看视频、进行在线游戏&#xff0c;甚至是使用云存储来保存你的重要文件。所有这些背后&#xff0c;其实都离不开一个无形的力量——云计算。而今天&#xff0c;5G网络的出现&#xff0c;就像为这些云服务加装了一对翅膀&#xff0c;让它们飞得…

GPT-1 与 BERT 架构

GPT-1 架构特点 仅解码器架构&#xff1a;摈弃了传统transformer中的编码器层&#xff0c;而是直接用解码器和自注意力&#xff0c;同时抛弃掉了交叉多头注意力层&#xff0c;自注意力通过mask来完成计算。注意力块添加到12个&#xff0c;Attention的输出维数为762维&#xff0…

Day04_C语言基础数据结构重点复习笔记20250618

1.什么是计算机的大小端存储&#xff1f; 答&#xff1a;大端是数据的高位字节存储在低地址&#xff0c;低位字节存储在高地址&#xff0c;网络协议&#xff08;如TCP/IP&#xff09;通常采用大端序&#xff08;称为“网络字节序”&#xff09;。例如&#xff1a;32位整数 0x12…