yaml语言入门(YAML Ain‘t Markup Language)

news2025/1/16 19:05:56

在这里插入图片描述

文章目录

  • YAML
    • 为什么YAML强调自己不是一种标记语言?
    • YAML文件与HTML、XML、JSON标记语言的异同
  • YAML的基本语法
  • 代码示例
    • python解析yaml示例
      • 示例1
      • 示例2
    • python组包yaml示例
  • 其他问题
    • yaml中的引用的作用和用法

YAML

YAML(YAML Ain’t Markup Language 强调不是一种标记语言)是一种人类可读的数据序列化格式。它的设计目标是使数据在不同编程语言之间易于传输和解析。YAML文件通常用于配置文件、数据交换和存储。

YAML最初由Clark Evans于2001年设计,并在2002年发布了第一个版本。它的设计灵感来自于其他数据序列化格式,如XML、JSON和电子邮件的头部。YAML的目标是提供一种简洁、易读、易写的数据格式,同时保持与现有编程语言的集成性。

为什么YAML强调自己不是一种标记语言?

YAML强调自己不是一种标记语言,是因为它与传统的标记语言(如HTML、XML)有一些重要的区别。

  1. 可读性:YAML的设计目标之一是易读性,它使用了一种简洁、直观的语法,使得人类可以轻松地阅读和理解YAML文件。相比之下,标记语言通常使用繁琐的标签和属性,使得文件更难以阅读和理解。

  2. 简洁性:YAML的语法非常简洁,可以用更少的字符来表达相同的信息。相比之下,标记语言通常需要更多的标签和属性来描述数据结构。

  3. 数据序列化:YAML是一种通用的数据序列化格式,可以轻松地在不同编程语言之间进行数据交换和存储。相比之下,标记语言通常用于描述文档结构和样式,不太适合用于数据序列化。

  4. 编程语言集成:YAML与许多编程语言有很好的集成性,可以方便地将YAML文件解析为相应的数据结构。

YAML强调自己不是一种标记语言,是因为它具有与传统标记语言不同的特点和优势,更适合用于数据序列化和配置文件。

YAML文件与HTML、XML、JSON标记语言的异同

  1. 语法:YAML使用缩进和特定的符号来表示数据结构,而HTML、XML和JSON使用标签、属性和键值对来表示数据结构。YAML的语法更加简洁、直观,易于阅读和编写。

  2. 用途:YAML主要用于配置文件和数据序列化,而HTML和XML主要用于描述文档结构和内容,JSON主要用于数据交换和存储。YAML更适合用于配置文件和复杂数据结构的表示,而HTML、XML和JSON更适合用于表示文档和简单数据结构。

  3. 数据类型:YAML支持多种数据类型,包括字符串、数字、布尔值、日期等,而HTML、XML和JSON主要支持字符串、数字和布尔值。YAML的数据类型更丰富,可以更准确地表示数据。

  4. 扩展性:HTML和XML可以通过自定义标签和属性来扩展其语义,而JSON和YAML的扩展性相对较弱。HTML和XML可以通过CSS和XSLT等技术进行样式和转换,而JSON和YAML通常需要使用专门的解析器或库来处理。

  5. 可读性:YAML强调可读性,其语法设计使得文件更易于阅读和理解。HTML、XML和JSON的语法相对较繁琐,文件更难以阅读和理解。

YAML的基本语法

YAML使用缩进和特定的符号来表示数据结构。下面是一些基本的语法规则:

  1. 注释:以#开头的行表示注释,注释内容将被忽略。

  2. 键值对:使用冒号:将键和值分隔,键值对可以写在一行上,也可以写在多行上。

    key: value
    
  3. 列表:使用短横线-表示列表项,列表项可以写在一行上,也可以写在多行上。

    - item1
    - item2
    
  4. 嵌套结构:可以使用缩进来表示嵌套的数据结构。

    key1:
      key2: value
    
  5. 引用:可以使用&定义一个引用,使用*引用一个已定义的引用。

    key1: &ref value
    key2: *ref
    
  6. 多行字符串:使用|表示保留换行符的多行字符串,使用>表示折叠换行符的多行字符串。

    key: |
      This is a
      multiline
      string.
    
    key: >
      This is a
      folded
      string.
    

这只是YAML的一些基本语法规则,YAML还支持更多的特性和数据类型,如映射、标量、日期等。详细的语法规范可以参考YAML官方网站。

代码示例

python解析yaml示例

有以下yaml文件:

example.yaml

name: John Smith
age: 30
address:
  street: 123 Main St
  city: Anytown
  state: NY
  country: USA

我们通过以下python代码来读取并解析它:

在这里插入图片描述

示例1

parse.py

import yaml

# 读取YAML文件
with open('example.yaml', 'r') as file:
    yaml_data = yaml.safe_load(file)

# 打印YAML内容


def print_yaml_data(data, indent=0):
    for key, value in data.items():
        if isinstance(value, dict):
            print(f"{' ' * indent}{key}:")
            print_yaml_data(value, indent + 2)
        else:
            print(f"{' ' * indent}{key}: {value}")


print('\n')

# 直接打印解析内容
print(yaml_data)

print('\n')

# 格式化打印
print_yaml_data(yaml_data)

print('\n')

运行python3 parse.py

在这里插入图片描述

示例2

parse.py

import yaml

# 读取YAML文件
with open('example.yaml', 'r') as file:
    yaml_data = yaml.safe_load(file)

# 将YAML内容存储到容器中
name = yaml_data['name']
age = yaml_data['age']
address = yaml_data['address']

street = address['street']
city = address['city']
state = address['state']
country = address['country']

# 打印存储的数据
print(f"Name: {name}")
print(f"Age: {age}")
print(f"Street: {street}")
print(f"City: {city}")
print(f"State: {state}")
print(f"Country: {country}")

运行结果:

在这里插入图片描述

python组包yaml示例

在这里插入图片描述

construct.py

import yaml

# 要组装的数据
name = 'Tylor Swift'
age = 23
street = '123 Main St'
city = 'Anytown'
state = 'NY'
country = 'USA'

# 组装数据为字典
data = {
    'name': name,
    'age': age,
    'address': {
        'street': street,
        'city': city,
        'state': state,
        'country': country
    }
}

# 将数据写入YAML文件
with open('example.yaml', 'w') as file:
    yaml.dump(data, file)

运行结果:

在这里插入图片描述

在这里插入图片描述

其他问题

yaml中的引用的作用和用法

在YAML中,引用(references)用于引用其他地方定义的值或数据结构。引用可以帮助减少重复的数据,并提高YAML文件的可读性和可维护性。

引用在YAML中使用&符号定义,并使用*符号进行引用。具体来说,引用有两个主要的应用场景:

  1. 引用标量值:可以使用引用来引用一个标量值,并在其他地方重复使用。这样可以避免在多个地方重复定义相同的值,提高了文件的可读性和可维护性。例如:
name: &name_ref John Smith

person1:
  name: *name_ref

person2:
  name: *name_ref

在上面的例子中,&name_ref定义了一个引用,指向值John Smith。然后,在person1person2中使用*name_ref引用了这个值,避免了重复定义。

  1. 引用数据结构:可以使用引用来引用一个数据结构,并在其他地方重复使用。这对于复杂的数据结构特别有用,可以避免在多个地方重复定义相同的结构,提高了文件的可读性和可维护性。例如:
person: &person_ref
  name: John Smith
  age: 30

person1: *person_ref

person2: *person_ref

在上面的例子中,&person_ref定义了一个引用,指向一个包含nameage字段的数据结构。然后,在person1person2中使用*person_ref引用了这个数据结构,避免了重复定义。

通过使用引用,可以在YAML文件中更好地组织和管理数据,减少冗余,并提高文件的可读性和可维护性。

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

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

相关文章

【Spring boot+VUE2+Android 7.1】智慧校园源码

一、智慧校园实现了智慧校园基础数据的统一管理,通过此平台提供教师基础信息管理、学生基础信息管理、用户认证管理、权限管理、资源管理、应用管理、第三方应用接入等基础功能与服务。 二、源码包含:电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系…

小马识途谈人物百科创建流程和技巧

百度百科通过搜集、整理和展示各种知识和信息,为人们提供了一个方便的查找和了解世界的平台。它的价值在于帮助人们获取知识和信息,并促进了知识的传播和共享。此外,百度百科还为学者、研究人员、教育工作者和一般公众提供了一个交流和分享知…

移动硬盘怎么加密?移动硬盘设置密码的方法

在工作中,我们经常需要使用移动硬盘来储存大量重要数据,而为了保护数据安全,我们则需要采用加密的方法来保护移动硬盘的安全。那么移动硬盘该怎么加密呢?下面我们就来了解两种移动硬盘加密的方法。 常规方法 我们可以使用BitLock…

计算机网络期末复习题(华南理工mooc习题及解答)

目录 🎉第一章 概述🎉 🎉第二章 物理层🎉 🎉第三章 数据链路层🎉 🎉第四章 网络层🎉 🎉第五章 运输层🎉 🎉第六章 应用层🎉 &am…

Vue 如何简单快速组件化

文章目录 前言相关文章组件化实战如何引入组件什么是父组件,什么是子组件如何实现给子组件赋值完整代码 如何调用子组件方法完整代码 总结 前言 为了简化拆分复杂的代码逻辑,和实现代码的组件化,封闭化。我们需要使用组件化的方法。我这里只…

划片机之半导体MiniLED/MicroLED封装技术及砂轮切割工艺

对于MiniLED和MicroLED的封装技术,除了之前提到的COB、coG、coF、IMD和MiP工艺,还有一些新的封装技术,例如: 0CRL(Oxide-Buffered CuInGaZn/Quar)工艺:这种工艺使用氧化物缓冲层来增强芯片和基板…

9.2.4 vim 的暂存盘、救援回复与打开时的警告讯息

当我们在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再创建一个名为.filename.swp 的文件。 比如说我们在上一个小节谈到的编辑 /tmp/vitest/man_db.conf 这个文件时, vim 会主动的创建 /tmp/vitest/.man_db.conf.swp 的暂存盘&#x…

网络运维工程师是干什么的:为网络世界保驾护航的技术守护者

网络运维工程师是现代企业中至关重要的职业之一。他们负责保证网络的正常运行,解决各种网络故障,并优化网络性能。本文将揭秘网络运维工程师的神秘面纱,带您了解他们的日常工作和职责。 1. 故障排除和维护: - 网络故障诊断&#x…

千亿儿童食品赛道,谁能成为行业“指明灯”?

文 | 螳螂观察 作者 | 易不二 近几年的热门赛道,风口此起彼伏,但儿童食品却是长风常吹。 《儿童零食市场调查白皮书》预测,2019—2023年间,儿童零食市场将以10%-15%的复合年增长率稳定增长,市场预期超6000亿元&…

【C++学习笔记】RAII思想——智能指针

智能指针 1 内存泄漏问题2 RAII(Resource Acquisition Is Initialization)2.1 使用RAII思想设计的SmartPtr类2.2 智能指针的原理2.3 小总结智能指针原理 3 智能指针的拷贝问题3.1 std::auto_ptr3.2 std::unique_ptr3.3 std::shared_ptr3.3.1 拷贝构造函数…

等保二级配置(四)口令复杂度策略和禁止root登录

口令复杂度策略 序号检查项名称检查指南符合性说明整改方法1口令复杂度策略1.确认账号现用密码; 2.查看配置文件/etc/pam.d/system-auth中相关参数。1.密码长度不小于8位,至少包括数字、大写字母、小写字母、特殊字符中的三种字符,非常见弱密…

23款奔驰GLS450时尚型更换原厂几何多光束大灯,让智能照亮您前行的路

奔驰几何多光束大灯核心特点就是通过内部的84颗可独立控制的LED光源,行车远光灯会甄别对向驶来的车辆或者行人,并且动态的跟随目标,之后阴影话该区域,避免晃到车辆和行人。

简单分享下小程序商城开发要多少钱

小程序商城的开发费用因多种因素而异,包括以下几点: 一、功能需求:商城的功能要求不同,开发所需的工作量也会有所不同。例如,基本的商品展示和购买功能相对较简单,而复杂的订单管理、支付、物流等功能可能需…

linux中安装Nginx的具体步骤

1.首先介绍一下Ngnix nginx是一款使用c语言编写的高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现得最好,中国大陆使用Nginx网站用户有:百度、京东、…

【IMX6ULL - LOGO替换】linux内核启动打印logo替换详细教程

Starting kernel ...[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.1.15 (root@ubuntu) (gcc version 5.3.0 (GCC) ) #1 SMP PREEMPT Thu Jul 6 16:06:11 CST 2023这里我们针对性的修改 “root@ubuntu”

java的集合框架ListSetMap

什么是集合? 存储多个对象的单一对象(java容器)。 为什么不用数组? 集合与数组都是对数据进行存储操作的结构,简称java容器。 此时的存储主要是内存方面的,不涉及到持久话存储(.txt,.jpg&#x…

XXX汽车SAP ERP系统预月结模式助力成本高效结算(投稿数字化月报二)

XXX汽车业务复杂,零部件数据繁多,SAP ERP系统实施时,引进了行业的领先模式,所以系统挑战相对大,尤其是在月底进行账务结算时,出现过结算异常的情况,而公司对月结有固定的完成时间,因…

Seafile搭建个人云盘 - 内网穿透实现在外随时随地访问

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 转载自cpolar极点云文章:使用SeaFile搭建…

Java 设计模式——代理模式

目录 1.概述2.结构3.静态代理3.1.实现3.2.优缺点 4.动态代理4.1.JDK 动态代理4.1.1.实现4.1.2.思考4.1.2.1.ProxyFactory 是代理类吗?4.1.2.2.动态代理的执行流程是什么样?4.1.2.3.为什么 JDK 动态代理只能代理有接口的类? 4.2.CGLIB 动态代理…

初识mysql数据库之数据类型

目录 一、数据类型 1. 数据类型分类 2. 数值类型 2.1 整数类型 2.2 位字段类型 2.3 小数类型 3. 字符串类型 3.1 char 3.2 varchar 4. 日期和时间类型 5. enum和set 5.1 enum介绍 5.2 set介绍 5.3 enum测试 5.4 set测试 5.5 enum的查找 5.6 set的查找 一、数据…