YAML总结

     一. YAML简介

估计大多数人都听说过XML,但YAML却很少听说,甚至都没有听说过,我也是其中之一,因为实习的公司需要用到这个相关的技术,也就特地了解了一下。为什么说起了YAML,却非要再提起XML呢?看这名字就知道,有故事呀。

首先,简要介绍一下YAML。YAML: YAML Ain't Markup Language,这是官方给的定义,什么意思呢?就是“YAML不是一种置标语言”。(在这里解释下置标语言:置标语言也称为标记语言,是一种将文本和与文本有关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码)。而XML,它是一种可扩展标记语言。

YAML相对于XML有哪些好处呢?

1. 可读性好

2. 与脚本语言的交互性好

3. 。。。。。。

总之,YAML就是致力于使用户以更简洁,更敏捷的方式去实现XML所能完成的任务。换句话说,是来砸XML饭碗的~~

还有一点,无关乎与XML的比较,是我从百度百科上查阅来的

1. “由于YAML使用空白字符和分行来分隔资料,使的他特别适合用grep、Python、Perl、Ruby操作。

2. 其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构中会变得复杂而难以辨认。

可能现在,你对这两点还无法理解,等看完下面内容,再回过头来看这个,便会豁然开朗~

好了,说完了好处,就开始具体说说YAML到底怎么表示以及怎么使用了。

二. YAML语法

在讲语法之前,首先在这里声明一下YAML的一些语法约束:

a.  在yaml里使用缩进表示层级关系,虽然很多人表示不喜欢这种方式,但是没办法,这样看着就是会更简洁一些。慢慢适应~

b.  在缩进时不允许使用tab(据了解好像是一些情况下tab表示的空格宽度不一)

c.  注意:同层元素,左侧对齐。很重要!

1、注释:

在yaml中,注释是以#开头的。从“#”字符开始一直到行尾都会被解析器给忽略

例:

# 看到没有,我就是注释内容~

2、文档(document)

在yaml中,一个yaml文件可以包含多个文档。且每个文档都以  ---  开始(即三个连字号),并且以三个点(...)结束。也就是说,可以用---来区分多个文档。其中有一点作为了解,可选择性的将...作为文档的结尾,使用...结尾时对于流式传输十分有用,可不需关闭流即知道到达结尾处。

3、 基础数据结构

yaml的设计者认为,配置文件中所要表达的数据结构有三种类型:

Scalar(标量,纯量):单个的,不可再分割的值

Mapping(映射,字典,对象):键值对的集合

Sequence(序列,数组,列表):一组按次序排列的值

这就是三种数据结构类型,下面对相关用法进行详细解释:

a. 首先是Sequence【用[...]】,一组连词线的行,构成了一个数组,如下:

- Cat

- Dog

- Pig

将上述转为JavaScript就是:

['Cat','Dog','Pig']

也可以直接使用 [...] 来表示:

[Cat,Dog,Pig]

此外,数组也可以采用行内表示法:

animal: [Cat,Dog]

转为相应的JavaScript如下:

{animal: ['Cat','Dog']}

b. 再就是Mapping【用{...}】,键值对之间要用冒号结构来表示,例如:

#要注意在冒号后面一定要有一个空格!
family: father

     不过,yaml也允许另一种写法:

      hash: { name: Steve, foo: bar}

      Mapping中,对于单一的key/value 对:直接表示为: name: DTree

      复杂key的key/value对:

#注意:当key为Sequence时要记得在key前面加上?

?[China,Japan,Malay]: AsianCountries

      复杂value的key/value对:

AsianCountries: [China,Japan,Malay]

********************************************************************************************

在了解了Sequence和Mapping后我们就能更容易地理解一些复合结构:

family:

  - father

  - mather

  - me

China:

  Anhui: Hefei

  Jiangsu: Nanjing

  Henan: Zhengzhou

转为JavaScript如下:

{

family: ['father', 'mather', 'me'],

China: {

Anhui: 'Hefei',

Jiangsu: 'Nanjing',

Henan: 'Zhengzhou'

}

}

********************************************************************************

c. 下面开始详细介绍Scalar(标量,纯量)

     以下数据类型都属于JavaScript的纯量:

*布尔值(true,false)

*字符串

*整数

*浮点数

*Null

*时间

*日期

    其中有几点重点提下:

**在yaml中,null用~来表示

YAML中:parent: ~

JavaScript中:{parent: null}

**yaml中允许使用两个感叹号,强制转换数据类型:

YAML中:e: !!str 123

  f: str true

JavaScript中:

{e: '123',f: 'true'}

4.YAML中的字符串:

在YAML中,字符串默认不用引号表示,但是如果字符串之中包含空格或者特殊字符,则需要放在引号之中:

#不含特殊符号
str: 这是一行字符串
#含特殊符号
str: '内容: 字符串'
#单引号和双引号的区别,其中双引号不会对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串"
#转为JavaScript后:
#{s1: '内容\\n字符串',s2: '内容\n字符串'}
#单引号之中如果还有单引号,则必须使用两个单引号进行转义:
str: 'labor''s day'
#转为 JavaScript
#{ str: 'labor\'s day' }
#字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str: 这是一段
  多行
  字符串
#转为 JavaScript 
#{ str: '这是一段 多行 字符串' }
#多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
  Foo
  Bar
that: >
  Foo
  Bar
#转为 JavaScript:
#{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
#+表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
s1: |
  Foo
s2: |+
  Foo
s3: |-
  Foo
#转为 JavaScript
#{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

5. YAML中的引用

锚点& 和 别名*,可以用来引用-------看了下面的语法就会感觉有点像C语言哈~

#&代表此模块可以被引用,建立锚点(defaults)

#<<表示合并到当前数据,*用来引用锚点

defaults: &defaults

    adapter: postgres

    host:      localhost

development:

    database: myapp_development

    <<: *defaults

等同于下面的代码:

defaults:

    adapter: postgres

    host:      localhost

development:

    database: myapp_development

    adapter: postgres

    host:       localhost

          







04-01
<think>好的,用户现在想了解YAML。我需要先回顾之前的对话,确保这次回答符合之前设定的格式和用户的需求。 用户之前询问了Anaconda中创建虚拟环境到指定位置的方法,现在转向YAML,可能是在配置conda环境或者其它项目时遇到了相关需求。YAML通常用于配置文件,比如Anaconda的environment.yml,或者CI/CD管道、Docker Compose等场景,所以用户可能是在学习如何编写这些配置文件。 首先,我需要确定用户对YAML的了解程度。用户可能刚接触,需要基础介绍,包括语法、结构、应用场景等。同时,用户可能关注如何在Anaconda中使用YAML,比如环境导出或创建,所以需要包含相关示例。 接下来,要确保回答结构清晰,分步骤或分部分讲解。根据之前的回答模式,使用标题、代码块、列表等来组织内容。同时,必须遵守系统级指令:行内公式用$...$,独立公式用$$...$$,但YAML可能涉及数学公式,这部分可能用上,但需要留意是否有需要的地方。 需要检查YAML的基本语法,如缩进、键值对、列表、注释、多行文本等,这些都是用户可能需要的基础知识。同时,给出实际应用的例子,比如Anaconda环境文件、Docker Compose、配置文件等,让用户看到实际应用场景。 还要注意常见问题,比如缩进错误、语法错误,帮助用户避免常见陷阱。此外,提供工具建议,比如VS Code的插件或在线验证器,方便用户编写和验证YAML文件。 需要确认用户是否需要与其他格式对比,比如JSON,但可能超出当前问题范围,可以简要提及。同时,确保语言简洁,避免技术 jargon,但保持专业性。 最后,总结YAML的优势和应用场景,帮助用户理解何时使用YAML。检查所有YAML示例是否正确,语法是否正确,避免格式错误导致用户困惑。确保回答符合中文要求,使用Markdown,但使用适当的标点和分段。</think>--- ### **YAML 简介** **YAML**(YAML Ain't Markup Language)是一种**人类可读的数据序列化格式**,广泛用于配置文件、数据交换和自动化脚本。它的设计目标是简洁易读,支持复杂数据结构,且与编程语言无缝集成。 --- ### **YAML 核心特性** 1. **简洁语法** 使用缩进和符号(如 `:` 和 `-`)代替括号,适合快速编写和阅读。 2. **数据类型支持** 支持字符串、数字、布尔值、列表、字典、多行文本等。 3. **跨平台兼容** 几乎所有编程语言都有解析库(如Python的 `PyYAML`、JavaScript的 `js-yaml`)。 4. **常见用途** - 配置文件(如Anaconda的 `environment.yml`、Docker Compose) - CI/CD 流水线(如GitHub Actions、GitLab CI) - 数据序列化(替代JSON或XML) --- ### **基础语法与示例** #### **1. 键值对(字典)** ```yaml # 简单键值对 name: "Alice" age: 30 is_student: false ``` #### **2. 列表** ```yaml # 列表用短横线 `-` 表示 languages: - Python - JavaScript - Java ``` #### **3. 嵌套结构** ```yaml # 字典与列表混合 person: name: "Bob" hobbies: - 游泳 - 读书 address: city: "北京" zip: 100000 ``` #### **4. 多行文本** 使用 `|` 保留换行符,或 `>` 折叠换行: ```yaml description: | 这是第一行, 这是第二行。 summary: > 这是一段很长的文本, 会自动合并为一行。 ``` #### **5. 注释** 以 `#` 开头: ```yaml # 这是注释 key: value # 行内注释 ``` --- ### **YAML 在 Anaconda 中的应用示例** Anaconda 使用 `environment.yml` 文件定义虚拟环境依赖: ```yaml name: my_env # 环境名称 channels: - defaults dependencies: - python=3.8 - numpy=1.21 - pandas - pip: - tensorflow==2.6.0 ``` - **创建环境**:`conda env create -f environment.yml` - **导出环境**:`conda env export > environment.yml` --- ### **YAML vs. JSON** | 特性 | YAML | JSON | |--------------|-------------------------------|----------------------| | **可读性** | 高(依赖缩进和自然语法) | 低(依赖括号和引号) | | **注释** | 支持 | 支持 | | **数据类型** | 更丰富(如日期、多行文本) | 基础类型 | | **适用场景** | 配置文件、人工编辑 | 数据交换、机器生成 | --- ### **常见问题与注意事项** 1. **缩进错误** YAML 严格依赖空格缩进(通常2或4空格),可用制表符(Tab)。 2. **特殊字符转义** 字符串中包含 `:` 或 `#` 时需加引号: ```yaml message: "键中包含冒号: 必须引号包裹" ``` 3. **锚点与别名** 通过 `&` 定义锚点,`*` 引用别名,避免重复: ```yaml defaults: &defaults timeout: 60 retry: 3 service_a: <<: *defaults port: 8000 ``` --- ### **工具推荐** 1. **VS Code 插件** - [YAML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml):提供语法高亮和验证。 2. **在线校验器** - [YAML Lint](https://www.yamllint.com/):检查语法错误。 3. **Python 解析库** ```python import yaml with open("config.yml") as f: data = yaml.safe_load(f) ``` --- ### **总结** - **YAML 优势**:易读、易写,适合人类编辑的配置文件。 - **典型场景**:开发环境配置、云原生应用(Kubernetes)、自动化工具。 - **学习建议**:从简单配置文件入手,逐步掌握复杂结构和高级特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值