原文: 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 解析器和发射器。

  1. $ pip install pyyaml

该模块通过 pip 安装。

YAML 文件

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

items.yaml

  1. raincoat: 1
  2. coins: 5
  3. books: 23
  4. spectacles: 2
  5. chairs: 12
  6. pens: 6

我们有几个标量值。

data.yaml

  1. cities:
  2. - Bratislava
  3. - Kosice
  4. - Trnava
  5. - Moldava
  6. - Trencin
  7. ---
  8. companies:
  9. - Eset
  10. - Slovnaft
  11. - Duslo Sala
  12. - Matador Puchov

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

Python YAML 读取

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

read_yaml.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. with open('items.yaml') as f:
  4. data = yaml.load(f, Loader=yaml.FullLoader)
  5. print(data)

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

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

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

Python YAML 阅读文档

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

read_docs.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. with open('data.yaml') as f:
  4. docs = yaml.load_all(f, Loader=yaml.FullLoader)
  5. for doc in docs:
  6. for k, v in doc.items():
  7. print(k, "->", v)

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

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

这是输出。

Python YAML 转储

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

dumping.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. users = [{'name': 'John Doe', 'occupation': 'gardener'},
  4. {'name': 'Lucy Black', 'occupation': 'teacher'}]
  5. print(yaml.dump(users))

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

  1. $ python dumping.py
  2. - name: John Doe
  3. occupation: gardener
  4. - name: Lucy Black
  5. occupation: teacher

这是输出。

Python YAML 写入

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

writing.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. users = [{'name': 'John Doe', 'occupation': 'gardener'},
  4. {'name': 'Lucy Black', 'occupation': 'teacher'}]
  5. with open('users.yaml', 'w') as f:
  6. data = yaml.dump(users, f)

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

  1. data = yaml.dump(users, f)

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

Python YAML 排序键

我们可以使用dumpsort_keys参数对键进行排序。

sort_keys.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. with open('items.yaml') as f:
  4. data = yaml.load(f, Loader=yaml.FullLoader)
  5. print(data)
  6. sorted = yaml.dump(data, sort_keys=True)
  7. print(sorted)

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

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

这是输出。

记号

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

tokens.py

  1. #!/usr/bin/env python3
  2. import yaml
  3. with open('items.yaml') as f:
  4. data = yaml.scan(f, Loader=yaml.FullLoader)
  5. for token in data:
  6. print(token)

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

  1. $ python tokens.py
  2. StreamStartToken(encoding=None)
  3. BlockMappingStartToken()
  4. KeyToken()
  5. ScalarToken(plain=True, style=None, value='raincoat')
  6. ValueToken()
  7. ScalarToken(plain=True, style=None, value='1')
  8. KeyToken()
  9. ScalarToken(plain=True, style=None, value='coins')
  10. ValueToken()
  11. ScalarToken(plain=True, style=None, value='5')
  12. KeyToken()
  13. ScalarToken(plain=True, style=None, value='books')
  14. ValueToken()
  15. ScalarToken(plain=True, style=None, value='23')
  16. KeyToken()
  17. ScalarToken(plain=True, style=None, value='spectacles')
  18. ValueToken()
  19. ScalarToken(plain=True, style=None, value='2')
  20. KeyToken()
  21. ScalarToken(plain=True, style=None, value='chairs')
  22. ValueToken()
  23. ScalarToken(plain=True, style=None, value='12')
  24. KeyToken()
  25. ScalarToken(plain=True, style=None, value='pens')
  26. ValueToken()
  27. ScalarToken(plain=True, style=None, value='6')
  28. BlockEndToken()
  29. StreamEndToken()

这是输出。

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

您可能也对以下相关教程感兴趣: Python 字符串Python Jinja 教程Python 教程,或列出所有 Python 教程