Python中的YAML入门介绍 YAML(YAML Ain’t Markup Language)是一种简单的数据序列化语言,用于表示结构化数据。它可以被人类轻松阅读和理解,也可以被计算机程序轻松解析和生成。YAML的语法简洁、直观,非常适合用于配置文件、数据交换和存储复杂数据结构。 在Python中,可以使用PyYAML库来处理YAML数据。PyYAML提供了丰富的API和功能,使得在Python中读取和写入YAML文件变得非常简单。 下面是一个简单的示例,展示了如何使用PyYAML库来读取和解析YAML文件: “`python import yaml # 读取YAML文件 with open(‘config.yaml’, ‘r’) as file: data = yaml.safe_load(file) # 输出YAML数据 print(data) “` 在上面的示例中,我们首先使用`open()`函数打开一个名为”config.yaml”的YAML文件,并使用`yaml.safe_load()`函数将其加载到一个变量中。然后,我们可以对这个变量进行操作,比如打印出来。 除了读取YAML文件,PyYAML还提供了将Python对象转换为YAML格式的功能。下面是一个简单的示例: “`python import yaml # 定义一个Python对象 data = { ‘name’: ‘John’, ‘age’: 30, ‘city’: ‘New York’ } # 将Python对象转换为YAML格式 yaml_data = yaml.dump(data) # 输出YAML数据 print(yaml_data) “` 在这个示例中,我们先定义了一个名为”data”的Python字典对象,然后使用`yaml.dump()`函数将其转换为YAML格式。最后,我们将转换后的YAML数据打印出来。 总之,YAML在Python中的应用非常广泛,它可以帮助我们轻松地处理结构化数据。如果你是Python初学者,我希望这个简短的介绍可以帮助你了解和使用YAML。
YAML Ain't Markup Language (YAML)是大多数编程语言的数据序列化语言。让我们详细了解一下。
YAML是JSON的严格超集,因此可以将JSON中的任何内容解析为YAML。它主要用于项目中的配置文件,非常容易理解和阅读代码。
YAML文件的文件扩展名为.yaml
或.yml
在本教程中,我们将学习在和Python中使用YAML的不同数据类型。在本教程结束时,您将能够了解YAML及其语法。
我假设您已经熟悉Python,如果不熟悉,请查看Python learning resources。
YAML遵循与Python类似的缩进语法。但是,它不允许使用制表符 (在编写YAML文件时请记住这一点)。
安装
- 安装一个名为
pyyaml
的Python模块,以便使用YAML 文件。
pip install pyyaml
- 将以下代码复制并粘贴到文件中,并将其保存为
yaml_script.py
import yaml
yaml_file = open("learn_yaml.yaml", 'r')
yaml_content = yaml.load(yaml_file)
print("Key: Value")
for key, value in yaml_content.items():
print(f"{key}: {value}")
- 我们将使用上述脚本将YAML代码转换为Python,并检查不同的数据类型。
- 创建一个名为
learn_yaml.yaml
的文件,并在其中练习我们将在本教程中讨论的不同示例。
废话不多说,让我们进入YAML的数据类型部分。
YAML中的数据类型
YAML 中的一切都是键值对。
在不同的编程语言中,我们对键值对有不同的名称,例如字典、散列表、对象等等,这些是YAML的构建块。
键可以是字符串(带引号或不带引号)、浮点数或整数(可能在将来的更新中更改支持)。值可以是任何YAML支持的数据类型。
让我们看看YAML中的不同数据类型。
数字
YAML 支持整数、浮点数和指数浮点数。
integer: 123
float: 123.123
exponential_float: 1.34e+3
当您使用Python脚本评估上述代码时,将获得以下结果。
Key: Value
integer: 123
float: 123.123
exponential_float: 1340.0
我们可以用不同的数字系统表示值,例如十进制、八进制和十六进制。
- 前导的零(0)表示它是一个八进制数。
- 前缀0x 表示它的十六进制值。
请参见下面的示例。
integer: 123
octal: 0123
hexa: 0x123
运行我们的Python脚本,我们可以看到八进制和十六进制值的转换为十进制值。您应该看到以下精确输出。
Key: Value
integer: 123
octal: 83
hexa: 291
YAML的另一个令人兴奋的地方是,我们可以表示 N**A**N(不是一个数字)和 Infinity(无穷大)。
not_a_number: .NAN
infinity: .inf
negative_infinity: -.inf
运行Python脚本,您将看到将NAN、和inf转换为Python的值。
Key: Value
not_a_number: nan
infinity: inf
negative_infinity: -inf
这就是YAML中的数字类型。
字符串
YAML中的字符串可以带引号或不带引号。两者很相似。与JSON不同,没有严格的规定将每个字符串放在引号中。但是,如果我们需要使用转义序列,那么我们必须使用双引号。
让我们看一些字符串的例子。
string: Hi, there I am a string
string with escape character: Hi, I am a newline n character. And I am not working :(
string with working escape character: "Hi, I am a newline n character. And I am working :)"
节的键值对中的换行符按预期工作。正如我们已经说过的,我们需要使用双引号来处理转义序列。
我们在下一个键值对中使用了双引号,它按预期工作。使用我们的Python脚本解释上面的YAML代码。您将得到以下结果。
键: 值
string: Hi, there I am a string
string with escape character: Hi, I am a newline n character. And I am not working :(
string with working escape character: Hi, I am a newline
character. And I am working :)
YAML中有两个特殊字符,我们可以使用它们将多个句子作为键的值写入。假设我们必须将一个长句子拆分为多行。在这种情况下,我们可以使用折叠(大于 >)或块(管道 |)字符来编写多行。
折叠 和块 字符之间有什么区别?接下来介绍一下。
折叠 字符不会解释换行符,而块 字符会解释。
让我们看一些例子。
multiple lines string with fold character: >
This is a
multiple line
string with fold
character. Remember to use
indentation. Newlines won't be
interpreted.
multiple lines string with block character: |
This is a
multiple line
string with fold
character. Remember to use
indentation. Newlines will be
interpreted.
运行Python脚本,然后您将看到折叠 和块 字符之间的区别。别忘了使用缩进。
键: 值
multiple lines string with fold character: This is a multiple line string with fold character. Remember to use indentation. Newlines won't be interpreted.
multiple lines string with block character: This is a
multiple line
string with fold
character. Remember to use
indentation. Newlines will be
interpreted.
布尔值
在YAML中,我们可以用三种不同的方式表示布尔值True和False 。看看它们。
- 值True, On和Yes 在YAML中被认为是True。
- 值False, Off和No 在YAML中被认为是False。
random_key_1: True
random_key_2: On
random_key_3: Yes
random_key_4: False
random_key_5: Off
random_key_6: No
如果您解释上面的YAML代码,那么您将得到前3个键值的值为True 和后3个键值的值为False。
键: 值
random_key_1: True
random_key_2: True
random_key_3: True
random_key_4: False
random_key_5: False
random_key_6: False
Null
YAML支持与JSON类似的null值。我们可以使用关键字null 或符号tilde(~) 来定义YAML中的null值。YAML有相当不错的替代方案,对吧?是的,它们有点酷。
null_case_1: null
null_case_2: ~
运行Python脚本。您将得到两个值都为None ,因为Python使用None 而不是null 关键字。
键: 值
null_case_1: None
null_case_2: None
数组
我们可以在YAML中指定与Python类似的数组。或者我们可以将所有数组元素写在前面带有连字符(-)的单独行中。让我们看看每种表示的示例。
programming_languages: [Python, JavaScript, C, HTML, CSS]
libraries: [React, TailwindCSS]
在上面的YAML代码中,我们使用了square方括号,类似于Python的列表。让我们再看看在YAML中表示数组的另一种方式(看起来像是markdown列表)。
programming_languages:
- Python
- JavaScript
- C
- HTML
- CSS
libraries:
- React
- TailwindCSS
如果您使用我们的Python脚本解释上述示例,您将得到以下输出。
programming_languages: [Python, JavaScript, C, HTML, CSS]
libraries: [React, TailwindCSS]
我们不仅可以在列表中使用字符串、数字等,还可以在列表中使用字典。
programming_languages: - Python: author: Guido van Rossum - JavaScript: author: Brendan Eich - C: author: Dennis Ritchie libraries: - React: popularity: High - TailwindCSS: popularity: High
如果您使用我们的Python脚本解释上述YAML代码,您将得到一个字典数组。
Key: Value
programming_languages: [{'Python': {'author': 'Guido van Rossum'}}, {'JavaScript': {'author': 'Brendan Eich'}}, {'C': {'author': 'Dennis Ritchie'}}]
libraries: [{'React': {'popularity': 'High'}}, {'TailwindCSS': {'popularity': 'High'}}]
字典
我们已经在上面的示例中看到了字典的语法。简单回顾一下,字典是键值对。我们可以将任何有效的数据类型作为键的值。YAML甚至支持嵌套字典。
让我们看一个示例。
dictionary:
i am key: i am value
nested dictionary:
nested key:
i am nested key: i am nested value
解释上述代码,您将看到以下结果。
Key: Value
dictionary: {'i am key': 'i am value'}
nested dictionary: {'nested key': {'i am nested key': 'i am nested value'}}
你知道你可以convert a list into a dictionary in Python吗?
集合
YAML支持另一种叫做集合的数据类型。集合包含唯一的值,类似于Python的set数据类型。集合项以问号(?)开头,就像列表项以连字符(-)开头一样。
我们需要使用!!set 在集合名称后来指定数据类型。
看下面的示例。
i am a set: !!set
? 1
? 2
? 2
? 3
由于集合只包含唯一的值,当您使用我们的Python脚本解释上述YAML代码时,您不会得到两次出现的2。
让我们看看结果。
Key: Value
set: {1, 2, 3}
我们还可以使用类似于Python语法的方式表示集合,如下所示。
i am a set: !!set
{1, 2, 2, 3}
您将得到与上面示例完全相同的输出。
这些就是YAML中的数据类型。让我们看看YAML中的一些其他特性。
注释
YAML支持注释。这很棒。我们可以在YAML中以井号(#) 符号开始编写注释。
# I am a comment
yaml is great: # I am a comment too
如果您解释上述YAML代码,那么您将得到一个空键和一个空值。
Key: Value
yaml is great: None
YAML不支持多行注释。我们必须像Python一样以井号开头编写多行注释。
锚点
锚点允许我们在整个文档中复制键的内容。如果您想要在文档中复制一些内容,这非常方便。
要使用锚点,我们必须在编程语言中将其定义为变量名。然后我们可以在整个文档中使用它。
我们可以使用&定义锚点名称,并使用*使用它。让我们来看一个例子。
# duplicate_data是锚点的名称
data: &duplicate_data 这是要复制的内容
# 复制数据
duplicate_data: *duplicate_data
在上面的例子中,我们使用了duplicate_data锚点来复制data键的值。如果您解释上面的YAML,这两个键都包含相同的值。
Key: Value
data: 这是要复制的内容
duplicate_data: 这是要复制的内容
结论
希望您对YAML有了很好的理解。现在,您可以在下一个项目的配置文件中使用YAML。您可以参考YAML官方网站获取更多高级内容。
愉快的编码🙂