ZetCode

Python YAML

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何在 Python 中使用 YAML 格式。我们使用 pyyaml 模块。

YAML 格式

YAML (YAML Ain't Markup Language) 是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储(例如调试输出)或传输(例如文档头)。

YAML 本地支持三种基本数据类型:标量(如字符串、整数和浮点数)、列表和关联数组。

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

PyYAML

PyYAML 是一个用于 Python 的 YAML 解析器和发射器。

$ pip install pyyaml

该模块使用 pip 安装。

YAML 文件

在本文中,我们使用以下 YAML 文件:

items.yaml
raincoat: 1
coins: 5
books: 23
spectacles: 2
chairs: 12
pens: 6

我们有几个标量值。

data.yaml
cities:
  - Bratislava
  - Kosice
  - Trnava
  - Moldava
  - Trencin
---
companies:
  - Eset
  - Slovnaft
  - Duslo Sala
  - Matador Puchov

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

Python YAML 读取

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

read_yaml.py
#!/usr/bin/python

import yaml

with open('items.yaml') as f:
    
    data = yaml.load(f, Loader=yaml.FullLoader)
    print(data)

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

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

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

Python YAML 读取文档

多个 YAML 文档使用 load_all 读取。

read_docs.py
#!/usr/bin/python

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 文件读取两个文档。

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

Python YAML 转储

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

dumping.py
#!/usr/bin/python

import yaml

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

print(yaml.dump(users))

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

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

Python YAML 写入

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

writing.py
#!/usr/bin/python

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 文件。

data = yaml.dump(users, f)

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

Python YAML 排序键

我们可以使用 dumpsort_keys 参数来排序键。

sort_keys.py
#!/usr/bin/python

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 输出中按键对数据进行排序。

$ 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

令牌

我们可以使用更底层的 API 来解析 YAML 文件。scan 方法扫描 YAML 流并生成扫描令牌。

tokens.py
#!/usr/bin/python

import yaml

with open('items.yaml') as f:
    
    data = yaml.scan(f, Loader=yaml.FullLoader)

    for token in data:
        print(token)

该示例扫描 YAML 文件并打印令牌。

$ 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()

来源

PyYAML 文档

在本文中,我们使用了 Python 中的 YAML 格式。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程