下班前几分钟,我彻底弄懂了YAML

目录

  • 1. YAML语法
    • 1.1 Scalars
    • 1.2 Array
    • 1.3 Object
    • 1.4 复杂结构
    • 1.5 高级用法
      • 1.5.1 浮点数特殊值
      • 1.5.2 锚点与别名
      • 1.5.3 合并键
  • 2. PyYAML的使用
    • 2.1 解析YAML
    • 2.2 生成YAML
  • 3. YAML和JSON的区别
  • Ref

1. YAML语法

YAML(YAML Ain’t Markup Language)是一种用于数据序列化的格式,广泛用于配置文件、数据交换等场景。它以其易于阅读和书写的特性而受到欢迎。YAML的设计目标是易于人类阅读和编写,同时也易于计算机解析和生成。

YAML配置文件的后缀名通常为 .yml.yaml(前者用的较多)。

一些注意事项:

  • YAML对大小写敏感
  • YAML不允许使用Tab,只允许使用空格
  • YAML用缩进表示层级关系。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • YAML支持注释,使用 # 代表注释行。

🧑‍💻 如果说JSON像C++,那么YAML就像Python,语法简洁而优雅,没有那么多冗余的大括号,方括号以及引号。

回顾JSON,它支持以下数据类型:

  • Object:由 {} 括起来的一组无序键值对。其中键必须是字符串,值可以是JSON支持的任意数据类型,包括Number、String、Boolean、Null、Array和Object本身。
  • Array:可以存放JSON支持的任意数据类型。
  • Scalars:包括Number、String、Boolean、Null。

YAML和其类似,只不过在 Scalars 中还支持日期和日期时间,以ISO 8601的格式进行表示。

📝 在ISO 8601标准下,日期格式为 YYYY-MM-DD,日期时间格式为 YYYY-MM-DDTHH:MM:SS[+/-]HH:MM。其中 T 用来分隔日期和时间,+- 表示相对于UTC时间的偏移。如果时间本身就是UTC时间,那么日期时间格式为 YYYY-MM-DDTHH:MM:SSZ,其中 Z 代表"Zulu time",也就是协调世界时(UTC)。

1.1 Scalars

先来看Scalars是什么样的:

string: "Hello, YAML"
boolean: true
integer: 123
float: 3.14
null: null
null2: ~
null3:
date: 2018-02-17
datetime: 2018-02-17T15:02:31+08:00
utctime: 2018-02-17T15:02:31Z

其对应的JSON为:

{"string": "Hello, YAML","boolean": true,"integer": 123,"float": 3.14,"null": null,"null2": null,"null3": null,"date": "2018-02-17T00:00:00.000Z","datetime": "2018-02-17T07:02:31.000Z","utctime": "2018-02-17T15:02:31.000Z"
}

可以看出YAML中的 null 有三种表示方式,而JSON只有一种。此外,JSON中的日期和时间全为字符串格式。

1.2 Array

再来看Array是什么样的:

items:- Apple- Banana- Cherry

其对应的JSON为:

{"items": ["Apple","Banana","Cherry"]
}

1.3 Object

最后看Object是什么样的:

person:name: John Doeage: 30

其对应的JSON为:

{"person": {"name": "John Doe","age": 30}
}

1.4 复杂结构

YAML支持数据的嵌套,允许创建复杂的数据结构。

family:parent: name: John Doeage: 40employed: trueaddress:street: 1234 Maple Streetcity: Anytownstate: Anystatezip: 12345coordinates:latitude: 40.7128longitude: -74.0060children:- name: Jane Doeage: 12hobbies:- Reading- Swimminggrade: 7favorite_color: "blue"- name: Doe Juniorage: 8hobbies:- Biking- Gaminggrade: 3favorite_color: "green"pets:- type: Dogname: Roverage: 5- type: Catname: Whiskersage: 3likes_water: falsevacation_spots:- location: "Paris, France"visited: true- location: "Tokyo, Japan"visited: falsehome_utilities:electricity: truegas: truewater: trueinternet_service_provider: null

其对应的JSON为:

{"family": {"parent": {"name": "John Doe","age": 40,"employed": true},"address": {"street": "1234 Maple Street","city": "Anytown","state": "Anystate","zip": 12345,"coordinates": {"latitude": 40.7128,"longitude": -74.006}},"children": [{"name": "Jane Doe","age": 12,"hobbies": ["Reading","Swimming"],"grade": 7,"favorite_color": "blue"},{"name": "Doe Junior","age": 8,"hobbies": ["Biking","Gaming"],"grade": 3,"favorite_color": "green"}],"pets": [{"type": "Dog","name": "Rover","age": 5},{"type": "Cat","name": "Whiskers","age": 3,"likes_water": false}],"vacation_spots": [{"location": "Paris, France","visited": true},{"location": "Tokyo, Japan","visited": false}],"home_utilities": {"electricity": true,"gas": true,"water": true,"internet_service_provider": null}}
}

1.5 高级用法

1.5.1 浮点数特殊值

YAML支持浮点数特殊值,而JSON不支持(会以 null 显示),所以我们要将其转化成Python对象然后打印出来。

+inf: .inf
-inf: -.inf
nan: .nan

转化成Python对象后:

{'+inf': inf, '-inf': -inf, 'nan': nan}

1.5.2 锚点与别名

YAML中的锚点(Anchors)和别名(Aliases)提供了一种强大的机制,允许你在YAML文档中定义一个值或对象,并在文档的其他地方通过引用来重用这个值或对象。这种机制既可以提高配置文件的可维护性,也可以减少重复内容,使得YAML文件更加简洁和易于管理。

锚点允许你标记一个特定的位置,你可以在YAML文件的任何地方定义一个锚点。创建锚点时,你需要使用 & 符号,后面跟上锚点的名称。这个名称是你自定义的,可以是任何有效的字符串,用来在稍后引用这个锚点。

一旦定义了锚点,就可以通过别名在文档的其他地方引用它。创建别名时,使用 * 符号,后面跟上之前定义的锚点名称。通过这种方式,你可以多次引用同一个锚点,无论是值、数组还是对象。

例1(对Scalars创建锚点):

default_path: &defaultPath /usr/local/binpathA: *defaultPath
pathB: *defaultPath

对应的JSON为

{"default_path": "/usr/local/bin","pathA": "/usr/local/bin","pathB": "/usr/local/bin"
}

例2(对Array创建锚点):

default_ports: &ports- 80- 443serviceA:ports: *portsserviceB:ports: *ports

对应的JSON为

{"default_ports": [80,443],"serviceA": {"ports": [80,443]},"serviceB": {"ports": [80,443]}
}

例3(对Object创建锚点):

default_server: &serverConfighost: localhostport: 8080development:server: *serverConfigproduction:server: *serverConfig

对应的JSON为

{"default_server": {"host": "localhost","port": 8080},"development": {"server": {"host": "localhost","port": 8080}},"production": {"server": {"host": "localhost","port": 8080}}
}

1.5.3 合并键

<< 可以将一个Object的所有键值对合并到另一个Object中,方便重用。

base: &basea: 1b: 2other:<<: *basec: 3d: 4

对应的JSON格式为

{"base": {"a": 1,"b": 2},"other": {"a": 1,"b": 2,"c": 3,"d": 4}
}

我们还可以基于此进行键值对的更新:

default_server: &serverConfighost: localhostport: 8080development:<<: *serverConfigport: 8081production:<<: *serverConfighost: example.com

对应的JSON为

{"default_server": {"host": "localhost","port": 8080},"development": {"host": "localhost","port": 8081},"production": {"host": "example.com","port": 8080}
}

2. PyYAML的使用

安装:

pip install pyyaml

导入:

import yaml

2.1 解析YAML

从YAML字符串或文件中加载数据时,yaml.load() 函数可以将YAML文档转换为Python字典对象。出于安全考虑,推荐使用 yaml.safe_load(),它只加载安全的 YAML 子集。

# 从字符串解析
yaml_str = """
a: 1
b:- 2- 3
"""
data = yaml.safe_load(yaml_str)
print(data)# 从文件解析
with open('example.yml', 'r') as f:data = yaml.safe_load(f)print(data)

2.2 生成YAML

yaml.dump() 函数可以将Python字典对象转换为YAML格式的字符串。你还可以将输出直接写入文件。

data = {'a': 1,'b': [2, 3]
}# 生成 YAML 字符串
yaml_str = yaml.dump(data)
print(yaml_str)# 写入文件
with open('output.yml', 'w') as f:yaml.dump(data, f)

通常 dump() 方法会对所有 key 按字典序进行排序,为避免排序,可以这样设置:

yaml.dump(data, f, sort_keys=False)

3. YAML和JSON的区别

YAML和JSON都是用于数据交换和存储的文本格式,它们在某些方面具有相似性,但也有几个关键的区别:

可读性

  • YAML:设计时就考虑到了可读性,它使用了缩进式的结构来表示数据层次,不使用大括号和方括号来表示对象和数组,这使得它在人类读写方面更加友好。
  • JSON:虽然也是文本格式,但使用大括号表示对象,方括号表示数组,逗号分隔键值对或数组元素,这使得它在机器解析方面更高效,但在人类阅读和编写时可能不如YAML直观。

数据类型支持

  • YAML:支持字符串、数字、日期、null、布尔值、数组、映射等类型,还支持更复杂的类型,如二进制数据和可以自定义类型的能力。
  • JSON:支持的基本数据类型有字符串、数字、对象(映射)、数组、布尔值和null。

注释

  • YAML:支持使用井号(#)添加注释,这对于解释或说明配置文件中的特定部分非常有用。
  • JSON:标准的JSON格式不支持注释,尽管一些JSON处理器可能会提供对注释的支持,但这并非广泛接受的标准。

冗余度

  • YAML:由于其设计注重人类的可读性和书写简便,它可能在表示相同的数据结构时比JSON更加简洁。
  • JSON:因为需要使用额外的符号(如大括号和方括号),在表示复杂的数据结构时可能比YAML更加冗长。

解析复杂性

  • YAML:其灵活性和对复杂数据类型的支持使得解析器相对更复杂,解析过程可能比JSON慢。
  • JSON:由于其结构简单,解析器通常更快,更少的内存占用,这在处理大量数据时尤其重要。

用途

  • YAML:常用于配置文件、数据交换等场景,特别是在需要高度可读性和人类编辑的环境中。
  • JSON:由于其简洁性和快速解析的特性,广泛用于网络传输、API交互等需要高效数据交换的场景。

Ref

[1] https://www.ruanyifeng.com/blog/2016/07/yaml.html
[2] https://www.runoob.com/w3cnote/yaml-intro.html
[3] https://codebeautify.org/yaml-to-json-xml-csv

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

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

相关文章

JavaScript编写幻灯片

问题&#xff1a;创建一段带有幻灯片效果的JavaScript代码&#xff0c;要包含一个有4幅图片&#xff0c;设置定时器&#xff0c;每隔5秒切换一次图片&#xff0c;如果用户单击开始按钮&#xff0c;定时器启动&#xff0c;并开始进行图片切换&#xff0c;如果用户单击停止按钮&a…

Java实战:Spring Boot接口重试机制实现

本文将详细介绍如何在Spring Boot应用程序中实现接口重试机制。我们将探讨重试机制的基本概念&#xff0c;以及如何使用Spring Boot和第三方库来实现接口的重试功能。此外&#xff0c;我们将通过具体的示例来展示如何在Spring Boot应用程序中配置和使用接口重试机制&#xff0c…

python数据类型及转换

一、数据类型 数据类型分为数值型、布尔型、字符串型等 1.1数值类型 数值类型可以分为整数类型、浮点数类型、复数类型 1.1.1整数类型 (1)概念&#xff1a;整数类型指数值是没有小数部分的&#xff0c;包含正整数、负整数和0 (2)进制种类&#xff1a;十进制--->234、5…

Effective C++ 学习笔记 条款08 别让异常逃离析构函数

C并不禁止析构函数吐出异常&#xff0c;但它不鼓励你这样做。这是有理由的&#xff0c;考虑以下代码&#xff1a; class Widget { public:// ...~Widget() { /* ... */ } // 假设这个可能吐出一个异常 };void doSomething() {std::vector<Widget> v;// ... } // v…

【网站项目】139选课排课系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Redis 群集

简介 在现在的互联网大潮中&#xff0c;NoSQL可谓家喻户晓&#xff0c;Redis作为NoSOL大军中极其重要的一员&#xff0c;是我们走向架构道路的一条必经之路。 Redis介绍 Redis 数据库是一个非关系型数据库&#xff0c;在正式学习Redis之前&#xff0c;我们先来了解关系型数据库…

算法沉淀——动态规划之完全背包问题(leetcode真题剖析)

算法沉淀——动态规划之完全背包问题 01.【模板】完全背包02.零钱兑换03.零钱兑换 II04.完全平方数 完全背包问题是背包问题的一种变体&#xff0c;与01背包问题不同&#xff0c;它允许你对每种物品进行多次选择。具体来说&#xff0c;给定一个固定容量的背包&#xff0c;一组物…

TCPDump 使用教程

每次服务器网络不通的时候&#xff0c;总会听到一个声音&#xff0c;你去抓包啊&#xff0c;那这里就来介绍下TCPDump&#xff0c;一款强大的网络分析工具&#xff0c;可以捕获网络上的数据包&#xff0c;并进行分析。这款工具在网络管理员和安全专家中非常受欢迎。 一、安装 …

防火墙:网络防御的第一道防线

目录 引言 一、安全技术与防火墙 &#xff08;一&#xff09;安全技术 &#xff08;二&#xff09;防火墙的主要功能与分类 1.防火墙的主要功能 2.防火墙的分类 二、Linux防火墙的基本认识 &#xff08;一&#xff09;Netfilter &#xff08;二&#xff09;防火墙工具…

单调队列(347. 前 K 个高频元素239. 滑动窗口最大值)

单调队列和单调栈其实差不多,就是维护一个区间单调的队列或者是栈,单调队列就是我们所说的大顶堆小顶堆, //升序队列 小顶堆 great 小到大 priority_queue <int,vector<int>,greater<int> > pri_que; //降序队列 大顶堆 less 大到小 默认 priority_qu…

【AI视野·今日NLP 自然语言处理论文速览 第八十一期】Mon, 4 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 4 Mar 2024 Totally 48 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Mitigating Reversal Curse via Semantic-aware Permutation Training Authors Qingyan Guo, Rui Wang, Junlia…

Fisher矩阵与自然梯度法

文章目录 Fisher矩阵及自然梯度法Fisher矩阵自然梯度法总结参考链接 Fisher矩阵及自然梯度法 自然梯度法相比传统的梯度下降法具有以下优势&#xff1a; 更好的适应性&#xff1a;自然梯度法通过引入黎曼流形上的梯度概念&#xff0c;能够更好地适应参数空间的几何结构。这使…

今日学习总结2024.3.3

今天也是全天自习的一天&#xff0c;非常充实 早上八点开始接着晚上的docker配置&#xff0c;并一边同步博客&#xff0c;还是遇到了卡壳看了一个视频&#xff0c;里面提到了物联网&#xff0c;感觉对这个概念更加了解了&#xff0c;当年填报专业志愿的时候有将物联网工程放在…

LCR 134. Pow(x, n)

解题思路&#xff1a; 分治 快速幂 Java中向下取整n/2即可 需要结合下图理解&#xff0c;算法就是实现的该过程 class Solution {public double myPow(double x, int n) {if(x 0.0f) return 0.0d;long b n;double res 1.0;//例如:2^-5(1/2)^5if(b < 0) {x 1 / x;b -b…

Python中可迭代数据类型

有序集合 有序的集合包括&#xff1a;列表、字符串以及元组。 对于任意Python序列可应用的运算&#xff1a; 运算名运算符解释长度len(sequence)返回序列的长度。索引访问sequence[i]返回索引 i 处的元素。切片sequence[i:j]返回从索引 i 到 j 的子序列。成员检查item in seq…

访问⾸⻚的速度很慢,有哪些⽅法可以提⾼访问速度?

1. 减少HTTP请求 可以通过简化页面设计&#xff0c;减少页面中图片、样式表、JavaScript等组件的数量来降低HTTP请求次数。此外&#xff0c;合并文件也是一个有效的方法&#xff0c;即将所有脚本或样式表文件合并为一个文件&#xff0c;和使用图片精灵以减少请求的数量。 2. …

【Python】Python教师/学生信息管理系统 [简易版] (源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

accept()函数

accept 函数是用于在服务器端接受客户端连接的系统调用。以下是 accept 函数的详细解读&#xff1a; #include <sys/types.h> #include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);sockfd&#xff1a; 是一个已经通过 soc…

京东商品优惠券API获取商品到手价

item_get_app-获得JD商品详情原数据 公共参数 请求地址: jd/item_get_app 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,i…

MATLAB环境下基于区域椭圆拟合的细胞分割方法

使用图像分割技术可以找到图像中的目标区域&#xff0c;目标区域可以定义为具有特定值的单个区域&#xff0c;也可以定义为具有相同值的多个区域。目前图像分割已经融入到生活中的方方面面&#xff0c;在遥感领域&#xff0c;它应用于航拍图中的地形、地貌的分割&#xff1b;在…