文章目录
- 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)有一些重要的区别。
-
可读性:YAML的设计目标之一是易读性,它使用了一种简洁、直观的语法,使得人类可以轻松地阅读和理解YAML文件。相比之下,标记语言通常使用繁琐的标签和属性,使得文件更难以阅读和理解。
-
简洁性:YAML的语法非常简洁,可以用更少的字符来表达相同的信息。相比之下,标记语言通常需要更多的标签和属性来描述数据结构。
-
数据序列化:YAML是一种通用的数据序列化格式,可以轻松地在不同编程语言之间进行数据交换和存储。相比之下,标记语言通常用于描述文档结构和样式,不太适合用于数据序列化。
-
编程语言集成:YAML与许多编程语言有很好的集成性,可以方便地将YAML文件解析为相应的数据结构。
YAML强调自己不是一种标记语言,是因为它具有与传统标记语言不同的特点和优势,更适合用于数据序列化和配置文件。
YAML文件与HTML、XML、JSON标记语言的异同
-
语法:YAML使用缩进和特定的符号来表示数据结构,而HTML、XML和JSON使用标签、属性和键值对来表示数据结构。YAML的语法更加简洁、直观,易于阅读和编写。
-
用途:YAML主要用于配置文件和数据序列化,而HTML和XML主要用于描述文档结构和内容,JSON主要用于数据交换和存储。YAML更适合用于配置文件和复杂数据结构的表示,而HTML、XML和JSON更适合用于表示文档和简单数据结构。
-
数据类型:YAML支持多种数据类型,包括字符串、数字、布尔值、日期等,而HTML、XML和JSON主要支持字符串、数字和布尔值。YAML的数据类型更丰富,可以更准确地表示数据。
-
扩展性:HTML和XML可以通过自定义标签和属性来扩展其语义,而JSON和YAML的扩展性相对较弱。HTML和XML可以通过CSS和XSLT等技术进行样式和转换,而JSON和YAML通常需要使用专门的解析器或库来处理。
-
可读性:YAML强调可读性,其语法设计使得文件更易于阅读和理解。HTML、XML和JSON的语法相对较繁琐,文件更难以阅读和理解。
YAML的基本语法
YAML使用缩进和特定的符号来表示数据结构。下面是一些基本的语法规则:
-
注释:以
#
开头的行表示注释,注释内容将被忽略。 -
键值对:使用冒号
:
将键和值分隔,键值对可以写在一行上,也可以写在多行上。key: value
-
列表:使用短横线
-
表示列表项,列表项可以写在一行上,也可以写在多行上。- item1 - item2
-
嵌套结构:可以使用缩进来表示嵌套的数据结构。
key1: key2: value
-
引用:可以使用
&
定义一个引用,使用*
引用一个已定义的引用。key1: &ref value key2: *ref
-
多行字符串:使用
|
表示保留换行符的多行字符串,使用>
表示折叠换行符的多行字符串。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中使用&
符号定义,并使用*
符号进行引用。具体来说,引用有两个主要的应用场景:
- 引用标量值:可以使用引用来引用一个标量值,并在其他地方重复使用。这样可以避免在多个地方重复定义相同的值,提高了文件的可读性和可维护性。例如:
name: &name_ref John Smith
person1:
name: *name_ref
person2:
name: *name_ref
在上面的例子中,&name_ref
定义了一个引用,指向值John Smith
。然后,在person1
和person2
中使用*name_ref
引用了这个值,避免了重复定义。
- 引用数据结构:可以使用引用来引用一个数据结构,并在其他地方重复使用。这对于复杂的数据结构特别有用,可以避免在多个地方重复定义相同的结构,提高了文件的可读性和可维护性。例如:
person: &person_ref
name: John Smith
age: 30
person1: *person_ref
person2: *person_ref
在上面的例子中,&person_ref
定义了一个引用,指向一个包含name
和age
字段的数据结构。然后,在person1
和person2
中使用*person_ref
引用了这个数据结构,避免了重复定义。
通过使用引用,可以在YAML文件中更好地组织和管理数据,减少冗余,并提高文件的可读性和可维护性。