YAML详解及使用方法

news2024/10/7 12:18:00

YAML详解及使用方法

  • 一、基本介绍
  • 二、数据类型
    • 2.1 纯量(scalars)/标量
      • 2.1.1 字符串
      • 2.1.2 保留换行(Newlines preserved)
      • 2.1.3 布尔值(Boolean)
      • 2.1.4 整数(Integer)
      • 2.1.5 浮点数(Floating Point)
      • 2.1.6 空(Null)
      • 2.1.7 时间戳(Timestamp)
      • 2.1.8 类型转换
    • 2.2 数组
      • 2.2.1 一组以**区块格式(Block Format)(即“破折号+空格”)**开头的数据组成一个数组
      • 2.2.2 同时也支持**内联格式(Inline Format)**来表达(用方括号包裹,逗号加空格分隔,类似 JSON)
      • 2.2.3支持多维数组(用缩进表示层级关系)
    • 2.3对象(Mapping)
      • 2.3.1 表示以键值对(key: value)形式出现的数据
      • 2.3.2 支持多层嵌套
      • 2.3.3支持流式风格( Flow style)的语法
      • 2.3.4 使用问号
    • 2.4 锚点
    • 2.5 合并标签
  • 三、yaml 文件的特点
    • 3.1 大小写敏感
    • 3.2 使用缩进表示层级关系
    • 3.3 缩进时不允许使用Tab键,只允许使用空格
    • 3.4 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
    • 3.5 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
    • 3.6 注释标识为#
    • 3.7一个文件中可以包含多个文件的内容
  • 四、使用方法
    • 4.1 安装方法
    • 4.2 解析yaml 文件
    • 4.3 生成yaml文件

一、基本介绍

YAML是一种计算机数据序列化语言。(YAML is a computer data serialization language.)YAML is a human friendly data serialization standard for all programming languages(YAML是一个对所有编程语言都很友好的数据序列化标准),可以用于多种编程语言。因其良好的跨语言、跨平台、易于理解、格式简单而广泛应用于配置文件、数据文件、日志文件等。

二、数据类型

YAML文档以人类可读的文本形式表示计算机程序的本地数据结构。YAML文档中的节点可以有三种基本数据类型:

2.1 纯量(scalars)/标量

单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等。

2.1.1 字符串

字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹

# YAML
strings:
  - Hello without quote # 不用引号包裹
  - Hello
   world # 拆成多行后会自动在中间添加空格
  - 'Hello with single quotes' # 单引号包裹
  - "Hello with double quotes" # 双引号包裹
  - "I am fine. \u263A" # 使用双引号包裹时支持 Unicode 编码
  - "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
  - 'He said: "Hello!"' # 单双引号支持嵌套"

// JSON
"strings":
  [ "Hello without quote",
    "Hello world",
    "Hello with single quotes",
    "Hello with double quotes",
    "I am fine. ☺",
    "\r\n is \r\n",
    "He said: 'Hello!'" ]

2.1.2 保留换行(Newlines preserved)

使用**竖线符“ | ”**来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留

# YAML
lines: |
  我是第一行
  我是第二行
    我是吴彦祖
      我是第四行
  我是第五行

// JSON
"lines": "我是第一行\n我是第二行\n  我是吴彦祖\n     我是第四行\n我是第五行"

2.1.3 布尔值(Boolean)

“true”、“True”、“TRUE”、“yes”、“Yes”和“YES”皆为真
“false”、“False”、“FALSE”、“no”、“No”和“NO”皆为假

# YAML
boolean:
  - true # True、TRUE
  - yes # Yes、YES
  - false # False、FALSE
  - no # No、NO

// JSON
"boolean": [ true, true, false, false ]

2.1.4 整数(Integer)

支持二进制表示

# YAML
int:
  - 666
  - 0001_0000 # 二进制表示

// JSON
"int": [ 666, 4096 ]

2.1.5 浮点数(Floating Point)

支持科学计数法

# YAML
float:
  - 3.14
  - 6.8523015e+5 # 使用科学计数法

// JSON
"float": [ 3.14, 685230.15 ]

2.1.6 空(Null)

“null”、“Null”和“~”都是空,不指定值默认也是空

# YAML
nulls:
  - null
  - Null
  - ~
  -

// JSON
"nulls": [ null, null, null, null ]

2.1.7 时间戳(Timestamp)

# YAML
date1: 2020-05-26
date2: 2020-05-26T01:00:00+08:00
dete3: 2020-05-26T02:00:00.10+08:00
date4: 2020-05-26 03:00:00.10 +8

// JavaScript
date1: Tue May 26 2020 08:00:00 GMT+0800 (中国标准时间),
date2: Tue May 26 2020 01:00:00 GMT+0800 (中国标准时间),
dete3: Tue May 26 2020 02:00:00 GMT+0800 (中国标准时间),
date4: Tue May 26 2020 03:00:00 GMT+0800 (中国标准时间)

2.1.8 类型转换

YAML 支持使用严格类型标签“!!”(双感叹号+目标类型)来强制转换类型

# YAML
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串

// JSON
"a": 666,
"b": "666",
"c": "666",
"d": "666.66",
"e": "true"
"f": "yes"

YAML 也可以使用一些更高级的类型,但是并不一定兼容所有解析器,包括集合(Sets)、有序映射(Ordered Map)、十六进制数据(Hexdecimal)和二进制数据(Binary)。

2.2 数组

一组按序排列的值(简称 “序列或列表”)数组前加有 “-” 符号,符号与值之间需用空格分隔。

2.2.1 一组以**区块格式(Block Format)(即“破折号+空格”)**开头的数据组成一个数组

# YAML
values:
  - value1
  - value2
  - value3

// JSON
"values": [ "value1", "value2", "value3" ]

2.2.2 同时也支持**内联格式(Inline Format)**来表达(用方括号包裹,逗号加空格分隔,类似 JSON)

# YAML
values: [value1, value2, value3]

// JSON
"values": [ "value1", "value2", "value3" ]

2.2.3支持多维数组(用缩进表示层级关系)

# YAML
values:
  -
    - value1
    - value2
  -
    - value3
    - value4

// JSON
"values": [ [ "value1", "value2"], ["value3", "value4"] ]

2.3对象(Mapping)

键值对的集合(简称 “映射或字典”)键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔。

2.3.1 表示以键值对(key: value)形式出现的数据

使用“冒号+空格”来分开键与值

# YAML
key: value

// JSON
"key": "value"

2.3.2 支持多层嵌套

# YAML
key:
  child-key1: value1
  child-key2: value2

// JSON
"key": {
  "child-key1": "value1",
  "child-key2": "value2",
}

2.3.3支持流式风格( Flow style)的语法

(用花括号包裹,用逗号加空格分隔,类似 JSON)

# YAML
key: { child-key1: value1, child-key2: value2 }

// JSON
"key": { "child-key1": "value1", "child-key2": "value2" }

2.3.4 使用问号

使用问号“?”*声明一个复杂对象,允许你使用多个词汇(数组)来组成键

# YAML
?
  - keypart1
  - keypart2
:
  - value1
  - value2

2.4 锚点

为了保持内容的简洁,避免过多重复的定义,YAML 提供了由**锚点标签“&”和引用标签“*”**组成的语法,利用这套语法可以快速引用相同的一些数据…

# YAML
a: &anchor # 设置锚点
  one: 1
  two: 2
  three: 3
b: *anchor # 引用锚点

// JSON
"a": {
  "one": 1,
  "two": 2,
  "three": 3
},
"b": {
  "one": 1,
  "two": 2,
  "three": 3
}

2.5 合并标签

配合**合并标签“<<”**使用可以与任意数据进行合并,你可以把这套操作想象成面向对象语言中的继承…

# YAML
human: &base # 添加名为 base 的锚点
    body: 1
    hair: 999
singer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    skill: sing # 添加额外的属性
programer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    hair: 6 # 覆写 base 中的属性
    skill: code # 添加额外的属性

// JSON
"human": { "body": 1, "hair": 999 },
"singer": { "body": 1, "hair": 999, "skill": "sing" },
"programer": { "body": 1, "hair": 6, "skill": "code" }

其他数据类型查看https://yaml.com/doc/glossary/

三、yaml 文件的特点

3.1 大小写敏感

One: 1
one: 2

3.2 使用缩进表示层级关系

3.3 缩进时不允许使用Tab键,只允许使用空格

3.4 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;

# YAML
one:
  two: 2
  three:
    four: 4
    five: 5

// 以上的内容转成 JSON 后
"one": {
  "two": 2,
  "three": {
    "four": 4,
    "five": 5 
  }
}

3.5 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;

3.6 注释标识为#

# 我是注释
# 我也是注释

注:只支持单行注释

3.7一个文件中可以包含多个文件的内容

  • 用“ — ”即三个破折号表示一份内容的开始
  • 用“ … ”即三个小数点表示一份内容的结束(非必需)
---
# 这是第一份内容
one: 1
# 其他内容...
...

---
# 这是第二份内容
two: 2
# 其他内容...

四、使用方法

在这里插入图片描述
官网给出编程语言对应的第三方库,下面以python为例,展示YAML的实际使用.

4.1 安装方法

pip install pyyaml

4.2 解析yaml 文件

import yaml

with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

print(config)

4.3 生成yaml文件

import yaml

data = {'name': '张三', 'age': 18, 'gender': '男'}

with open('data.yaml', 'w') as f:
    yaml.dump(data, f)

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

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

相关文章

WIN11右键菜单替换成WIN10右键菜单的办法

想必很多人已经都是使用上Win11的系统了。今天就来解决一个让人很无语的问题&#xff0c;就是这个win11的右键菜单。真的是太太太难用了。 能一步完成的操作&#xff0c;非要需要我多走一步。真的是麻了。 亲爱的Windows 11右键菜单&#xff0c;你的设计真是令人头疼。 那么我…

项目经理跨部门沟通的6个原则

大家好&#xff0c;我是老原。今天想和大家聊聊跨部门沟通。 你们在项目管理工作中&#xff0c;都是如何跨部门沟通&#xff0c;协调资源的&#xff1f; 项目经理80%的工作时间都是在沟通&#xff0c;一名优秀的项目经理&#xff0c;无疑是一个好的沟通者。 但不理解你的领导…

气象站的组成,有什么作用?

气象站的含义&#xff1a; 气象站是监测环境要素的仪器&#xff0c;比如&#xff1a;空气温度、空气湿度、风速、风向、大气压力、光照度等。气象站对环境要素的监测是通过不同传感器实现的&#xff0c;各个传感器既可以单独使用&#xff0c;也可以搭配使用&#xff0c;监测到…

董明珠怒斥员工「吃着碗里看着锅里」,如何看待?

导言&#xff1a; 最近&#xff0c;格力电器董事长董明珠因怒斥员工「吃着碗里看着锅里」的言论引起了广泛关注。这一事件激起了公众对职业素养和领导方式的讨论。本文将从职业素养的视角出发&#xff0c;探讨如何看待董明珠的怒斥员工事件。 领导者的压力与情绪管理 作为一位顶…

NCCoE发布“向后量子密码学迁移”项目进展情况说明书

近日&#xff0c;NIST下属的国家网络安全中心&#xff08;NCCoE&#xff09;发布了一份向后量子密码学迁移&#xff08;Migration to Post-Quantum Cryptography&#xff09;项目情况说明书。该文档简要概述了向后量子密码学迁移项目的背景、目标、挑战、好处和工作流程&#x…

2023年高教社杯 国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

使用Gitea自建仓库 并配置git上传

使用Gitea自建仓库 并配置git上传 使用 Docker 安装 | Gitea Documentation 1. 安装Docker 2. 使用Docker Compose快速安装 在安装目录下创建config 和 data两个文件夹 以下是我的配置&#xff0c;和官网提供的大差不差 version: "3"networks:gitea:external: …

c++入门——变量

专栏简介&#xff1a;为什么我要重新介绍c的相关知识&#xff0c;在此之前&#xff0c;我对于c的了解也仅仅是在表面。而在后来与c慢慢的接触中&#xff0c;c编程语言越来越让我觉得深奥&#xff0c;所以还是想要重新开创一个专栏来介绍c。对于c的介绍&#xff0c;本专栏会先介…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly&#xff08;Wasm&#xff09;是一种通用字节码技术&#xff0c;它可以将其他编程语言&#xff08;如 Go、Rust、C/C 等&#xff09;的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

1688API技术解析,实现按关键字搜索1688接口

要实现按关键字搜索1688商品&#xff0c;您可以使用1688提供的API来完成。下面是对1688 API的技术解析&#xff1a; 1. 注册成为1688开发者&#xff1a; 首先&#xff0c;您需要在1688开放平台上注册成为开发者&#xff0c;并创建一个应用以获取API访问权限。 2. 获取API访…

低代码是什么?能做什么?

2014 年全球权威咨询机构 Forrester 在报告中首次引入了低代码的概念&#xff0c;放眼彼时的中国市场&#xff0c;低代码这一名词还鲜为人知。随着国家积极推动数字化发展&#xff0c;越来越多的企业投入到了数字化经济的建设中&#xff0c;低代码也在这样的大环境中快速成长。…

JVM ZGC垃圾收集器

ZGC垃圾收集器 ZGC&#xff08;“Z”并非什么专业名词的缩写&#xff0c;这款收集器的名字就叫作Z Garbage Collector&#xff09;是一款在JDK 11中新加入的具有实验性质[1]的低延迟垃圾收集器&#xff0c;是由Oracle公司研发的。 ZGC收集器是一款基于Region内存布局的&#…

【RS485 - 总线冲突】

最近写了一个小小的串口通信程序&#xff0c;逻辑上感觉没什么问题&#xff0c;但就是数据与设定值不对。最后发现应该是总线冲突的问题。 在RS485通信中&#xff0c;如果在接收完数据后立即发送数据&#xff0c;可能会引发总线冲突问题。这是因为在RS485通信中&#xff0c;设…

经典问题解析四

关于动态内存分配 new 和 malloc 的区别是什么&#xff1f; delete 和 free 的区别是什么&#xff1f; new 关键字与 malloc 函数的区别 new 关键字是 C 的一部分 malloc 是由 C 库函数提供的函数 new 是以具体类型为单位进行内存分配 malloc 以字节为单位进行内存分配 …

webrtc-m79-msvc编译H264

0 写在前面 本文主要参考&#xff1a;webrtc 4577版本vs编译_tusong86的博客-CSDN博客 感谢作者的付出&#xff1b; 1 编译参数 powershell运行&#xff1a; // debug 需要编译参数 enable_iterator_debuggingtrue gn gen h264-debug-m79 --argsis_debugtrue use_lldfalse …

电脑日历怎么添加日程?如何在电脑上设置日程提醒?

在办公室使用电脑办公时&#xff0c;我们需要在电脑日历上添加日程&#xff0c;以便及时提醒自己工作中的重要事件。比如&#xff0c;我们需要安排明天的会议时间、发送重要文件的截止日期&#xff0c;或者是提醒自己去参加一个重要的客户洽谈会。这些日程安排对于我们的工作效…

财报解读:上半年GMV超50亿元,交个朋友瞄准了更广阔的市场

于今年7月曲线上市的交个朋友交出了首份“答卷”。 近日&#xff0c;交个朋友控股披露了2023年上半年财报&#xff0c;营收4.33亿元&#xff0c;同比增长215.5%&#xff1b;经调整净利润约9463.5万元&#xff0c;同比暴增1798%&#xff1b;全网合计GMV超50亿元。 图源&#xf…

strtok函数

目录 分隔函数 strtok 函数原型&#xff1a; 参数&#xff1a; 返回值&#xff1a; 代码演示&#xff1a; 函数解析&#xff1a; 注意事项&#xff1a; 分隔函数 strtok 函数原型&#xff1a; char * strtok ( char * str, const char * sep); 参数&#xff1a; str—要…

vue-drag-resize实现拖拽,座椅摆放

插件&#xff1a; vue-drag-resize <div class"drag-resize"><!-- https://juejin.cn/post/6844903713430061063isActive 是否激活状态 Default: falsew,h 组件宽度,高度 Default: 200--><VueDragResize :isActive"true" :w"100&qu…

筑牢数据隐私安全底线,ADSCOPE通过ISO隐私信息管理体系认证!

数字时代&#xff0c;信息安全尤其是数据隐私信息保护已经成为社会共识。近日&#xff0c;ADSCOPE&#xff08;上海倍孜网络技术有限公司&#xff09;已通过相关组织机构评审&#xff0c;符合ISO/IEC 27701&#xff1a;2019标准&#xff0c;获得隐私信息管理体系认证证书&#…