YAML+PyYAML笔记 2 | YAML缩进、分离、注释简单使用

1 简介

  • YAML 不是一种标记语言,而是一种数据格式;
  • 使用缩进和分离来表示数据结构,不需要使用额外的标记语言。

2 缩进

  • 使用缩进来表示嵌套关系;
  • 标识方式为使用空格;
  • 缩进必须使用相同数量的空格;
  • 比如以下每个列表项都由一个连字符开头,后面跟着一个空格;(每行都有相同数量的缩进,子项的缩进比父项的缩进多两个空格,以此表示嵌套关系)
 - name: noamanelson
  bolg: https://blog.csdn.net/NoamaNelson
  description: tester
  language:
    - python
    - c
    - c++
    - go
    - java
  operating_system:
    - linux
    - windows
 - name: xiaoming
  age: 88
  description: Old Monster
  • 输出为:
# 解析
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/27 
# 文件名称:yaml_read.py
# 作用:yaml读取
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

with open("config_suojin.yaml") as f:
    yaml_data2 = yaml.load(f, Loader=yaml.FullLoader)
print(yaml_data2)

# 输出
[{'name': 'noamanelson',
 'bolg': 'https://blog.csdn.net/NoamaNelson', 
 'description': 'tester', 
 'language': ['python', 'c', 'c++', 'go', 'java'], 
 'operating_system': ['linux', 'windows']}, 
 {'name': 'xiaoming',
  'age': 88, 
  'description': 'Old Monster'}]

3 分离

  • 使用分离表示键和值之间的关系;
  • 冒号用于分离键和值;
  • 冒号之后必须跟空格;
  • 示例:
author: libai
age: 未知
verse_title: 静夜思
content:
  one: 窗前明月光,
  two: 疑是地上霜.
  three: 举头望明月,
  four: 低头思故乡.
  • 解析:
with open("config_suojin.yaml") as f:
    yaml_data2 = yaml.load(f, Loader=yaml.FullLoader)
print(yaml_data2)

# 输出:
{'author': 'libai', 
'age': '未知', 
'verse_title': '静夜思', 
'content': {'one': '窗前明月光,', 'two': '疑是地上霜.', 'three': '举头望明月,', 'four': '低头思故乡.'}}

4 多行文本

  • 文本值比较长,需要占据多行,表示方式有以下:
    在这里插入图片描述

折叠块,字面块、引用块

4.1 折叠块

  • 折叠块将多行文本合并为一行;
  • 并删除行末的换行符和空格;
  • 使用垂直条>进行表示。
song: >
  曾经有一份真挚的爱情摆在我的面前
  我没有好好珍惜 等到失去时 才感到后悔
  如果老天能够再给我一次机会
  我回对那个女孩说 我爱你
  如果非要在这个爱上加个期限的话
  我希望是 一万年
  曾是你陪我 度过漫长的那么多天
  是你对我说还有真爱
  而我却不懂 如何呵护你
  爱你却伤了你的心
  就在我的心 刚要融化的时候
  而你却悄悄地离去
  我多希望你 希望你回心转意
  因为我将会把你珍惜
  还有什么话要说 还有多少泪要流
  难道你不知道 我对你的爱
  还有什么话要说 还有多少泪要流
  有一天我会让你回心转意

# 解析
{'song': '曾经有一份真挚的爱情摆在我的面前 我没有好好珍惜 等到失去时 才感到后悔 如果老天能够再给我一次机会 我回对那个女孩说 我爱你 如果非要在这个爱上加个期限的话 我希望是 一万年 曾是你陪我 度过漫长的那么多天 是你对我说还有真爱 而我却不懂 如何呵护你 爱你却伤了你的心 就在我的心 刚要融化的时候 而你却悄悄地离去 我多希望你 希望你回心转意 因为我将会把你珍惜 还有什么话要说 还有多少泪要流 难道你不知道 我对你的爱 还有什么话要说 还有多少泪要流 有一天我会让你回心转意\n'}

4.2 字面块

  • 字面块会原样输出多行文本;
  • 包括换行符和空格;
  • 用垂直条(|)进行表示。
song: |
  曾经有一份真挚的爱情摆在我的面前
  我没有好好珍惜 等到失去时 才感到后悔
  如果老天能够再给我一次机会
  我回对那个女孩说 我爱你
  如果非要在这个爱上加个期限的话
  我希望是 一万年
  曾是你陪我 度过漫长的那么多天
  是你对我说还有真爱
  而我却不懂 如何呵护你
  爱你却伤了你的心
  就在我的心 刚要融化的时候
  而你却悄悄地离去
  我多希望你 希望你回心转意
  因为我将会把你珍惜
  还有什么话要说 还有多少泪要流
  难道你不知道 我对你的爱
  还有什么话要说 还有多少泪要流
  有一天我会让你回心转意

# 解析
{'song': '曾经有一份真挚的爱情摆在我的面前\n我没有好好珍惜 等到失去时 才感到后悔\n如果老天能够再给我一次机会\n我回对那个女孩说 我爱你\n如果非要在这个爱上加个期限的话\n我希望是 一万年\n曾是你陪我 度过漫长的那么多天\n是你对我说还有真爱\n而我却不懂 如何呵护你\n爱你却伤了你的心\n就在我的心 刚要融化的时候\n而你却悄悄地离去\n我多希望你 希望你回心转意\n因为我将会把你珍惜\n还有什么话要说 还有多少泪要流\n难道你不知道 我对你的爱\n还有什么话要说 还有多少泪要流\n有一天我会让你回心转意\n'}

4.3 引用块

  • 引用会用到 &锚点符合和 *星号符号;
  • &用来建立锚点,<< 表示合并到当前数据, 用来引用锚点;
user: &useradd
  name: xiaozhang
  age: 20

dept:
  id: 12324343434
  <<: *useradd
  
#相当于:
user: 
  name: xiaozhang
  age: 20

dept:
  id: 12324343434
  name: xiaozhang
  age: 20
  • 文件内引用已经定义好的变量:
base.host: https://xxx.com
add.person.url: ${base.host}/person/add

5 注释

  • 分行内注释和块注释。

5.1 行内注释

  • 行内注释用#符号
  • #符号后面的内容会被解析器忽略;
# 行内注释
name: xiaozhang # 这是name的值

5.2 块注释

  • 即多行注释;
#- name: noamanelson
#  bolg: https://blog.csdn.net/NoamaNelson
  description: tester
  language:
    - python
    - c
    - c++
    - go
    - java
#  operating_system:
#    - linux
#    - windows
#- name: xiaoming
#  age: 88
#  description: Old Monster
{'description': 'tester', 'language': ['python', 'c', 'c++', 'go', 'java']}

5.3 完美注释示例

# 配置文件
# 
# 下面是一些基本的设置
app.name: "app_demo" # 应用程序名称
app.host: "localhost" # 应用程序主机名
app.port: 8080 # 应用程序端口
app.debug: true # 是否输出调试信息

# 数据库配置项
# 
# 数据库地址
db.host: "localhost"
# 数据库端口号
db.port: 3306
# 数据库名
db.name: "database"
# 数据库用户名
db.user: "root"
# 数据库密码
{'app.name': 'app_demo', 'app.host': 'localhost', 'app.port': 8080, 'app.debug': True, 'db.host': 'localhost', 'db.port': 3306, 'db.name': 'database', 'db.user': 'root', 'db.password': '123456'}
posted @ 2023-07-27 14:59  虫无涯  阅读(7)  评论(0编辑  收藏  举报  来源