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)是大多数编程语言的数据序列化语言。让我们详细了解一下。

YAMLJSON的严格超集,因此可以将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中,我们可以用三种不同的方式表示布尔值TrueFalse 。看看它们。

  • True, OnYes 在YAML中被认为是True
  • False, OffNo 在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官方网站获取更多高级内容。

愉快的编码🙂

类似文章