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'}