# Python YAML 教程

> 原文： [http://zetcode.com/python/yaml/](http://zetcode.com/python/yaml/)

Python YAML 教程展示了如何在 Python 中使用 YAML 格式。 我们使用 PyYAML 模块。

## YAML 格式

YAML（不是 YAML 标记语言）是一种人类可读的数据序列化语言。 它通常用于配置文件，但也用于数据存储（例如调试输出）或传输（例如文档标题）。

YAML 本机支持三种基本数据类型：标量（例如字符串，整数和浮点数），列表和关联数组。

官方推荐的 YAML 文件扩展名是`.yaml`。 Python 中有两个用于 YAML 的模块：PyYAML 和`ruamel.yaml`。 在本教程中，我们使用前者。

## PyYAML

PyYAML 是 Python 的 YAML 解析器和发射器。

```py
$ pip install pyyaml

```

该模块通过 pip 安装。

## YAML 文件

在本教程中，我们使用以下 YAML 文件：

`items.yaml`

```py
raincoat: 1
coins: 5
books: 23
spectacles: 2
chairs: 12
pens: 6

```

我们有几个标量值。

`data.yaml`

```py
cities:
  - Bratislava
  - Kosice
  - Trnava
  - Moldava
  - Trencin
---
companies:
  - Eset
  - Slovnaft
  - Duslo Sala
  - Matador Puchov

```

我们在`data.yaml`中有两个文档。 文件用`---`分隔。

## Python YAML 读取

在第一个示例中，我们读取了一个 YAML 文件。

`read_yaml.py`

```py
#!/usr/bin/env python3

import yaml

with open('items.yaml') as f:

    data = yaml.load(f, Loader=yaml.FullLoader)
    print(data)

```

我们打开`items.yaml`文件，并使用`yaml.load()`方法加载内容。 数据被打印到控制台。

```py
$ python read_yaml.py
{'raincoat': 1, 'coins': 5, 'books': 23, 'spectacles': 2, 'chairs': 12, 'pens': 6}

```

PyYAML 模块将标量值转换为 Python 字典。

## Python YAML 阅读文档

使用`load_all()`读取多个 YAML 文档。

`read_docs.py`

```py
#!/usr/bin/env python3

import yaml

with open('data.yaml') as f:

    docs = yaml.load_all(f, Loader=yaml.FullLoader)

    for doc in docs:

        for k, v in doc.items():
            print(k, "->", v)

```

该示例从`data.yaml`文件中读取两个文档。

```py
$ python read_docs.py
cities -> ['Bratislava', 'Kosice', 'Trnava', 'Moldava', 'Trencin']
companies -> ['Eset', 'Slovnaft', 'Duslo Sala', 'Matador Puchov']

```

这是输出。

## Python YAML 转储

`dump()`方法将 Python 对象序列化为 YAML 流。

`dumping.py`

```py
#!/usr/bin/env python3

import yaml

users = [{'name': 'John Doe', 'occupation': 'gardener'},
         {'name': 'Lucy Black', 'occupation': 'teacher'}]

print(yaml.dump(users))

```

在示例中，我们有一个字典列表。 我们使用`dump()`方法将列表序列化为 YAML 格式。

```py
$ python dumping.py
- name: John Doe
  occupation: gardener
- name: Lucy Black
  occupation: teacher

```

这是输出。

## Python YAML 写入

以下示例将 Python 数据写入 YAML 文件。

`writing.py`

```py
#!/usr/bin/env python3

import yaml

users = [{'name': 'John Doe', 'occupation': 'gardener'},
         {'name': 'Lucy Black', 'occupation': 'teacher'}]

with open('users.yaml', 'w') as f:

    data = yaml.dump(users, f)

```

该示例将字典列表写入`users.yaml`文件。

```py
data = yaml.dump(users, f)

```

我们使用`dump()`方法写入数据。 第一个参数是数据，第二个参数是文件对象。

## Python YAML 排序键

我们可以使用`dump`的`sort_keys`参数对键进行排序。

`sort_keys.py`

```py
#!/usr/bin/env python3

import yaml

with open('items.yaml') as f:

    data = yaml.load(f, Loader=yaml.FullLoader)
    print(data)

    sorted = yaml.dump(data, sort_keys=True)
    print(sorted)

```

该示例从`items.yaml`文件中读取数据，并通过 YAML 输出中的键对数据进行排序。

```py
$ python sort_keys.py
{'raincoat': 1, 'coins': 5, 'books': 23, 'spectacles': 2, 'chairs': 12, 'pens': 6}
books: 23
chairs: 12
coins: 5
pens: 6
raincoat: 1
spectacles: 2

```

这是输出。

## 记号

解析 YAML 文件时，我们可以使用较低级别的 API。 `scan()`方法扫描 YAML 流并生成扫描记号。

`tokens.py`

```py
#!/usr/bin/env python3

import yaml

with open('items.yaml') as f:

    data = yaml.scan(f, Loader=yaml.FullLoader)

    for token in data:
        print(token)

```

该示例扫描 YAML 文件并打印记号。

```py
$ python tokens.py
StreamStartToken(encoding=None)
BlockMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='raincoat')
ValueToken()
ScalarToken(plain=True, style=None, value='1')
KeyToken()
ScalarToken(plain=True, style=None, value='coins')
ValueToken()
ScalarToken(plain=True, style=None, value='5')
KeyToken()
ScalarToken(plain=True, style=None, value='books')
ValueToken()
ScalarToken(plain=True, style=None, value='23')
KeyToken()
ScalarToken(plain=True, style=None, value='spectacles')
ValueToken()
ScalarToken(plain=True, style=None, value='2')
KeyToken()
ScalarToken(plain=True, style=None, value='chairs')
ValueToken()
ScalarToken(plain=True, style=None, value='12')
KeyToken()
ScalarToken(plain=True, style=None, value='pens')
ValueToken()
ScalarToken(plain=True, style=None, value='6')
BlockEndToken()
StreamEndToken()

```

这是输出。

在本教程中，我们使用 Python 中的 YAML 格式。

您可能也对以下相关教程感兴趣： [Python 字符串](/lang/python/strings/)， [Python Jinja 教程](/python/jinja/)和 [Python 教程](/lang/python/)，或列出[所有 Python 教程](/all/#python) 。