YAML+PyYAML笔记 4 | YAML字符流、节点属性、块伸缩标头使用

4 | YAML字符流、节点属性、块伸缩标头使用

1 字符流

1.1 表示方式

  • YAML字符流是将多个文档放在同一个文件中,通过“—”分隔符进行分割;
  • 示例:
---
user1:
  name: xiaoming
  age: 23
  password: 123456
---
user2:
  name: xiaozhang
  age: 24
  password: 123456
---
user3:
  name: xiaoli
  age: 25
  password: 123456
  • 以上包含了三个文档,每个文档都以“—”分隔符作为开始标志;
  • 需要逐个读取每个文档,然后将它们解析为相应的YAML对象。

1.2 字符流解析

  • 使用PyYAML库读取YAML字符流;
  • 通过load_all函数,将字符流中的每个文档解析为YAML对象;
  • 由于一个文档可能包括多个对象,因此需要使用循环逐个读取每个文档,然后解析其中的对象。
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/28 
# 文件名称:yaml_read01.py
# 作用:字符流解析
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import yaml

# 读取YAML字符流
stream = open('config_zifuliu.yaml', 'r')
docs = yaml.load_all(stream, Loader=yaml.FullLoader)

# 解析多个文档
for doc in docs:
    print(doc)

# 关闭文件流
stream.close()
  • 输出为:
{'user1': {'name': 'xiaoming', 'age': 23, 'password': 123456}}
{'user2': {'name': 'xiaozhang', 'age': 24, 'password': 123456}}
{'user3': {'name': 'xiaoli', 'age': 25, 'password': 123456}}

2 节点属性

  • 每个节点都有一组属性,这些属性可以添加在节点名称后,用花括号表示;
  • 属性名和属性值用冒号隔开,多个属性之间用逗号隔开;
  • 属性值可以是任意类型的标量值,也可以是映射对象和列表对象;

带 ID 的节点

# 带 ID 的节点
- id: 1
  name: xiaoli
  age: 33

- id: 2
  name: xiaowang
  age: 44

对象属性的定义

# 定义一个 student 对象
- person:
    id: 1
    name: xiaozhagn
    age: 45

列表属性的定义

# 定义一个列表
- person:
    - xiaozhang
    - xiaoli
    - xiaowang

属性的嵌套

# 定义一个嵌套的对象
 - person:
    id: 123
    name: xiaowang
    age: 99
    grades:
      math: 100
      science: 100
      history: 100

3 块伸缩标头

  • 块是一种结构,为结构化数据提供缩进关系的文本块;
  • 块之间的关系可以使用细节和更高的缩放级别进行解释和表述;
  • 块伸缩标头就是定义块扩展和缩放的一种方法,可以使 YAML 代码的可读性和可维护性更高。
# 块缩进级别为 0
name: John
age: 25
address:
  street: 123 Main St
  city: Anytown
  state: CA
  zip: 12345

# 使用 '+' 扩大缩进级别
- name: Jane
  age: 30
  address:
    +street: 123 Main St
    +city: Anytown
    +state: CA
    +zip: 12345

# 使用 '-' 缩小缩进级别
- name: Bob
  age: 35
  -address:
    street: 123 Main St
    city: Anytown
    state: CA
    zip: 12345

# 嵌套块使用不同的符号
people:
+  - name: Alice
+    age: 40
+    address:
+      city: Anytown
+      street: 123 Main St
-  - name: Eve
-    age: 45
-    address:
-      city: Anytown
-      street: 123 Main St
posted @ 2023-07-28 10:34  虫无涯  阅读(2)  评论(0编辑  收藏  举报  来源