YAML 文件语法学习

2023-11-19

一、概述

YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点,YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用。

YAML 的语法比较简洁直观,特点是使用空格来表达层次结构,其最大优势在于数据结构方面的表达,所以 YAML 更多应用于编写配置文件,其文件一般以 .yaml 为后缀,通常也缩写为.yml

二、yaml 语法特点

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格( 低版本限制 )
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #表示注释
  • 使用 Unicode 编码作为字符标准编码,例如 UTF-8

三、YAML 与 XML、JSON

3.1、YAML 与 XML

语法:YAML 更加简洁易读,更适合人类阅读和编辑,而 XML 语法比较繁琐,更适合机器解析。

树形结构:XML 是基于树形结构的,需要显式地定义父子节点的关系,而 YAML 是基于缩进的,通过缩进表示层级关系,更加灵活。

扩展性:XML 有大量的标准和规范,可以很好地支持扩展,而 YAML 的扩展性相对较差。

应用场景:XML 更适合用于传输和存储结构化数据,如配置文件、文档等;YAML 更适合用于定义数据结构和对象序列化,如在编程语言中使用。

总的来说,YAML 更加人性化和灵活,XML 更加标准化和严谨,应根据具体应用场景选择使用。

3.2、YAML 与 JSON

  • JSON 可以看作是 YAML 的子集,也就是说 JSON 能够做的事情,YAML 也能够做
  • YAML 能表示得比 JSON 更加简单和阅读,例如“字符串不需要引号”。所以 YAML 容易可以写成 JSON 的格式,但并不建议这种做
  • YAML 能够描述比 JSON 更加复杂的结构,例如“关系锚点”可以表示数据引用(如重复数据的引用)。

YAML 和 JSON 都是常用的数据序列化格式,它们有以下比较:

语法:YAML 语法相对于 JSON 更加简洁易读,更适合人类阅读和编辑,而 JSON 语法更加紧凑,更适合机器解析。

树形结构:JSON 和 XML 一样,是基于树形结构的,需要显式地定义父子节点的关系,而 YAML 是基于缩进的,通过缩进表示层级关系。

扩展性:JSON 的扩展性相对较好,支持各种数据类型,可用于序列化复杂数据结构,而 YAML 的扩展性相对较差。

应用场景:JSON 更适合用于 Web 应用中,如 Ajax 或 RESTful API,因为它更加轻量级和易于处理;YAML 更适合用于配置文件和数据序列化,如在编程语言中使用。

总的来说,YAML 更加人性化和易读,JSON 更加紧凑和高效,应根据具体应用场景选择使用。

四、yaml 支持的数据类型

  • 纯量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/哈希(hash)/字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) /列表(list)

4.1、对象

即键值对key: value

  • 对象键值对使用冒号结构表示key: value,冒号后面要加一个空格
  • 也可以使用key:{key1: value1, key2: value2, ...}
  • 还可以使用缩进表示层级关系
  • 较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value
    如下:
name: "Jahn"
age: 21

# 行内对象,即使用{}写成一行,在 YAML 1.0 中,流式风格被称为“非文档流式”,但是在 1.1 版本中更名为“流式”,并进行了更新。在 YAML 1.2 中,流式风格得到了进一步的改进和扩展。
info: {name: "Jahn", age: 21}

# 缩进表示层级关系
info: 
    name: "Jahn"
    age: 21

# 较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value
?
    -complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

# 意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]

4.2、数组

一组按次序排列的值,又称为序列(sequence)/列表(list)有以下集中形式:

  • 一组以区块格式(Block Format)(即“破折号+空格”)开头的数据组成一个数组
animals:
  - Cat
  - Dog
  - Goldfish

{ animals: [ 'Cat', 'Dog', 'Goldfish' ] }
  • 同时也支持内联格式(Inline Format)来表达(用方括号包裹,逗号加空格分隔,类似 JSON)
values: [value1, value2, value3]

{ values: [ 'value1', 'value2', 'value3' ] }
  • 支持多维数组(用缩进表示层级关系)
values:
  -        # 数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
    - value1
    - value2
  -
    - value3
    - value4

{ values: [ [ 'value1', 'value2' ], [ 'value3', 'value4' ] ] }

注意,第2行和第5行不能添加东西,否则解析出来就不是二维数组了,如下面反例

values:
  - sx1
    - value1
    - value2
  - sx2
    - value3
    - value4

{ values: [ 'sx1 - value1 - value2', 'sx2 - value3 - value4' ] }

4.3、复合结构

对象和数组可以结合使用,形成复合结构

sport:
 - swim
 - run
 - basketball

city:
 haidian: beijing.haidian
 jinan: shandong.jinan
 hefei: anhui.hefei

4.4、纯量

纯量是最基本的、不可再分的值

字符串
布尔值
整数
浮点数
Null
时间
日期

示例如下:

boolean: 
    - TRUE  # true,True都可以
    - FALSE  # false,False都可以
float:
    - 3.14
    - 6.8523015e+5  # 可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    # 二进制表示
null:
    nodeName: 'node'
    parent: ~  # 使用~表示null
string:
    - 哈哈
    - 'Hello world'  # 可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    # 字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

4.4.1、字符串

  • 字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹
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!"'        # 单双引号支持嵌套"
  - \n \r             
  - '\n \r'                    
  - "\n \r"                    

其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!"',
     '\\n \\r',
     '\\n \\r',
     '\n \r' ] }
  • 对于多行的文字,YAML 提供了两种特殊的语法支持

    • 保留换行(Newlines preserved)

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

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

    JSON格式如下:

    { lines: '我是第一行\n我是第二行\n  我是吴彦祖\n    我是第四行\n我是第五行\n' }
    
    • 折叠换行(Newlines folded)

    使用右尖括号>来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格

    lines: >
    我是第一行
    我也是第一行
    我仍是第一行
    我依旧是第一行
    
    我是第二行
    这么巧我也是第二行
    

    其JSON格式如下:

    { lines: '我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行\n' }
    

    注意,此方法最后一行末尾换行符会被识别

    • 还可以用+和-来选择是否保留文字块末尾的换行符

      + 表示保留文字块末尾的换行,-表示删除字符串末尾的换行

    s1: |
    Foo
    s2: |+
    Foo
    s3: |-
    Foo
    

    其JSON如下:

    { s1: 'Foo\n', s2: 'Foo\n', s3: 'Foo' }
    

4.4.2、布尔值

  • "true"、"True"、"TRUE"、"yes"、"Yes"和"YES"皆为真
  • "false"、"False"、"FALSE"、"no"、"No"和"NO"皆为假
boolean:
  - True
  - true
  - False
  - FALSE

4.4.3、整数

支持二进制表示

int:
  - 666    # 十进制
  - 0b10   # 0b 前缀,二进制
  - 010    # 0 前缀,八进制
  - 0x10   # 0x 前缀,十六进制

4.4.4、浮点数

支持科学计数法

float:
  - 3.14
  - 6.8523015e+5  # 指数必须是整数
  - 6E3

4.4.5、空值

nulls:
  - 
  - null
  - Null
  - NULL
  - ~

4.4.6、时间

时间采用 ISO8601 格式

iso8601: 2001-12-14t21:59:43.10-05:00

4.4.7、日期

日期采用 ISO8601 格式的年、月、日表示

date: 1976-07-31

4.5、类型转换

YAML 支持使用严格类型标签!!(双感叹号+目标类型)来强制转换类型,下面是内置类型

符号 含义
!!int 整数类型
!!float 浮点类型
!!bool 布尔类型
!!str 字符串类型
!!binary 也是字符串类型
!!timestamp 日期时间类型
!!null 空值
!!set 集合
!!omap,!!pairs 键值列表或对象列表
!!seq 序列,也是列表
!!map 键值表
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串

4.6、引用

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

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

# 锚点必须加在冒号后,值之前,然后用*符号可以解引用

4.7、合并

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

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

可以对比其jaon值理解:

{ human: { body: 1, hair: 999 },
  singer: { body: 1, hair: 999, skill: 'sing' },
  programer: { body: 1, hair: 6, skill: 'code' } }

参考文档

1、https://blog.csdn.net/dreaming_coder/article/details/106973969

2、https://blog.csdn.net/qq_25447799/article/details/120319542

3、https://blog.csdn.net/weixin_43340943/article/details/105953673

4、https://www.cnblogs.com/yxfeng/p/10396288.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YAML 文件语法学习 的相关文章

  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • Scrapy 文件管道不下载文件

    我的任务是构建一个可以下载所有内容的网络爬虫 pdfs 在给定站点中 Spider 在本地计算机和抓取集线器上运行 由于某种原因 当我运行它时 它只下载一些但不是全部的 pdf 通过查看输出中的项目可以看出这一点JSON 我已经设定MEDI
  • NSUserNotificationCenter.defaultUserNotificationCenter() 使用 PyInstaller 返回 None

    我正在尝试将通知发送到通知中心 Mac OSX 我正在使用 PyObjC 绑定来使用我们的 python 应用程序中的 cocoa api 我正在使用以下代码片段 import Foundation import objc NSUserNo
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Snakemake:将多个输入用于具有多个子组的一个输出的规则

    我有一个工作管道 用于下载 比对和对公共测序数据执行变体调用 问题是它目前只能在每个样本的基础上工作 i e作为每个单独测序实验的样本 如果我想对一组实验 例如样本的生物和 或技术复制 执行变体调用 则它不起作用 我试图解决它 但我无法让它
  • 将图与热图(可能是对数)配对?

    How to create a pair plot in Python like the following but with heat maps instead of points or instead of a hex bin plot
  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • Python脚本从字母和两个字母组合生成单词

    我正在编写一个简短的脚本 它允许我使用我设置的参数生成所有可能的字母组合 例如 b a 参数 单词 5 个字母 第三 第五个字母 b a 第一个字母 ph sd nn mm 或 gh 第二 第四个字母 任意元音 aeiouy 和 rc 换句
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 根据标点符号列表替换数据框中的标点符号[重复]

    这个问题在这里已经有答案了 使用 Canopy 和 Pandas 我有数据框 a 其定义如下 a pd read csv text txt df pd DataFrame a df columns test test txt 是一个单列文件
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM

随机推荐

  • 内核虚拟化KVM/QEMU——guest os,qemu,kvm的运行流程

    内核虚拟化KVM QEMU guest os qemu kvm的运行流程 这里主要介绍基于x86平台的Guest Os Qemu Kvm工作流程 如图 通过KVM APIs可以将qemu的command传递到kvm 1 创建VM syste
  • 问题 对于二分类问题,当训练集中正负样本非常不均衡时,如何处理数据以更好 地训练分类模型?

    为什么很多分类模型在训练数据不均衡会出现问题 本质原因是模型在训练时优化的目标函数和人们测试时使用的评价标准不一致 这种不一致可能是训练数据的样本分布和测试数据的不一致 例如训练时优化的整个训练集 正负比例1 99 的正确率 而测试的时候期
  • JavaScript [数组去重] 的部分方法总结

    参考了文章 JavaScript数组去重 12种方法 史上最全 有部分改动 删去了一些没用的代码 替换了部分for循环 一 利用ES6 Set去重 ES6中最常用 function arrayRemoveSame arr return Ar
  • 二手房各项税费计算公式

    北京的房屋类型有很多种 有商品房 公房 一类经适房 二类经适房 两限房 现针对这些类型的房子列一下二手房购置过程中 需要考虑的税费 一 各类房源简介 1 商品房 正规从售楼处买的房源 2 公房 单位分的房子 由于不知道原值 所以个税按 网签
  • sbrk/brk函数用法

    头文件unistd h sbrk brk函数重新指定数据段的结束位置 sbrk 0 获得当前数据段结束地址 sbrk 增量 增量可正 可负 可为0 都返回原来数据段的结束地址 失败返回 1 brk 地址 返回0或 1 通过重新指定数据段新的
  • Matlab导入Excel数据快速绘图

    现在使用Matalb绘图越来越多 不会这个绘图技能感觉都要被时代抛弃了 所以 本文主要是介绍怎么用Matlab导入Excel数据快速绘图 目录 一 基本使用 二 细致调节 1 颜色选项 2 形状选项 3 网格线选项 一 基本使用 事先 建议
  • Python爬虫进阶--js逆向

    目标网址 aHR0cHM6Ly93d3cuZG5zLmNvbS9sb2dpbi5odG1s 抓包定位 首先抓包看请求 这里 password 和 email 都经过加密了 token 可以在页面上找到 从这里进去搜索 直接搜索 passwo
  • 【赠书活动|第六期《强化学习:原理与Python实战》】

    文章目录 RLHF是什么 RLHF适用于哪些任务 RLHF和其他构建奖励模型的方法相比有何优劣 什么样的人类反馈才是好的反馈 RLHF算法有哪些类别 各有什么优缺点 RLHF采用人类反馈会带来哪些局限 如何降低人类反馈带来的负面影响 图书简
  • 打卡C语言学习第十三天

    对之前所学内容复习和补充 练习函数书写
  • ruoyi登录流程

    首先加载登录界面会发送验证码请求和获取Cookie 会调用created函数 Getcode是获取验证码 GetCookie是获取cookie GetCodeImg函数会调用ajax发送请求给后端 后端GetMapping接口接收到请求后执
  • 搜狐2012.9.15校园招聘会笔试题

    一 不定项选择题 1 以下程序的打印结果是 include
  • Android SurfaceView

    下面就贴上一个小程序代码 主要运用SurfaceView来实现在屏幕上画一个圆 你可以通过按方向键和触摸屏幕来改变圆的位置 代码 Activity java view plain copy print package com view im
  • TypeError: 'function' object is not subscriptable

    报错 function object is not subscriptable 原因是Hi是个匿名函数 应该用 而不是 改成 即可 像这种问题TypeError function object is not subscriptable 一般
  • 迷宫问题java老鼠走迷宫(回溯法,递归,二维数组)(超级容易理解)

    回溯法迷宫问题 思路 利用回溯法和递归思想解决 findWay 方法就是专门来找出迷宫的路径 如果找到 就返回 true 否则返回 false map 就是二维数组 即表示迷宫 i j 就是老鼠的位置 初始化的位置为 1 1 因为我们是递归
  • mysql索引实现

    目前大部分数据库系统及文件系统都采用B Tree B树 或其变种B Tree B 树 作为索引结构 B Tree是数据库系统实现索引的首选数据结构 在MySQL中 索引属于存储引擎级别的概念 不同存储引擎对索引的实现方式是不同的 本文主要讨
  • Ubuntu下无法看到共享文件夹的解决办法

    1 输入以下指令 确定共享文件夹是否设置成功 vmware hgfsclient 若是设置成功 会输出贡献文件夹的名字 2 如果已经设置了共享文件夹 请输入下列指令 如果之前没有命令包则先执行sudo apt get install ope
  • 在linux下如何查看局域网的所有主机的ip地址

    策略 用nmap对局域网扫描一遍 然后查看arp缓存表就可以知道局域内ip对应的mac了 nmap比较强大也可以直接扫描mac地址和端口 执行扫描之后就可以 cat proc net arp查看arp缓存表了 或者使用命令arp a 参考
  • 【Goland】巧妙用批量替换Replace

    今天想提一嘴 IDE 的一个功能 就是批量替换 Replace in Path 大家可以按快键键 commnd 进入 Preference 然后搜索 Keymap 也就是快键键 然后搜索 Replace 找到批量替换的快键键 因为快键键就是
  • C# 处理异常

    using System using System Collections Generic using System Linq using System Text namespace Ch13CardLib public class Car
  • YAML 文件语法学习

    一 概述 YAML是一个类似 XML JSON 的标记性语言 YAML 强调以数据为中心 并不是以标识语言为重点 YAML 是一种较为人性化的数据序列化语言 可以配合目前大多数编程语言使用 YAML 的语法比较简洁直观 特点是使用空格来表达