简介:
YAML是一种数据序列化格式,常用于配置文件、数据交换和存储。其设计目标是简洁易读,同时支持复杂数据结构。
语法:
- 缩进:使用空格(禁止用制表符)表示层级关系,同一层级缩进必须一致。
- 键值对:用冒号
:
分隔键和值,值可以是标量(字符串、数字等)、列表或嵌套结构。- 注释:以
#
开头,仅支持单行注释。- 字符串:可省略引号,但含特殊字符时需用单引号
'
或双引号"
。
YAML文件数据类型
普通数据类型:
ymal:
string: "Hello, YAML"
number: 42
boolean: true
null_value: null
JSON:
{
"string": "Hello, YAML",
"number": 42,
"boolean": true,
"null_value": null
}
列表:
YMAL:
fruits:
- Apple
- Banana
- Orange
JSON:
{
"fruits": [
"Apple",
"Banana",
"Orange"
]
}
字典:
YMAL:
person:
name: "Alice"
age: 30
skills:
- Python
- YAML
JSON:
{
"person": {
"name": "Alice",
"age": 30,
"skills": [
"Python",
"YAML"
]
}
}
多行字符串:
description: |
This is a
multiline
string.
{
"description": "This is a \nmultiline \nstring. \n"
}
锚点引用合并键
- 锚点(&):用于定义一个可复用的内容块,相当于给这段内容起一个 “别名”。
- 引用(*):用于引用之前通过锚点定义的内容块,直接复用其所有配置。
defaults: &defaults # 用&defaults定义锚点,将defaults下的配置标记为可复用
timeout: 30 # 锚点包含的配置1
retries: 3 # 锚点包含的配置2
service:
<<: *defaults # 用*defaults引用锚点内容,将defaults的配置合并到service中
port: 8080 # service自身的额外配置
上述代码等同于
service:
timeout: 30
retries: 3
port: 8080
合并键:
- 作用:将一个或多个映射(map)的内容合并到当前映射中,通常与锚点配合使用,实现配置复用。
- 支持同时合并多个映射,用列表形式传入多个引用。
合并多个引用:
common: &common
log: true
server: &server
port: 8080
app:
<<: [*common, *server] # 同时合并common和server的配置
name: myapp # 新增app特有的配置
等价于:
app:
log: true
port: 8080
name: myapp
读取和写入YMAL文件
安装ymal库:
pip install PyYAML==6.0.1
import yaml
#追加写⼊
def write_yaml(filename, data):
with open(filename, encoding="utf-8", mode="a+") as f:
yaml.safe_dump(data, stream=f)
#读取
def read_yaml(filename, key):
with open(filename, encoding="utf-8", mode="r") as f:
data = yaml.safe_load(f)
return data[key]
#清空
def clear_yaml(filename):
with open(filename, encoding="utf-8", mode="w") as f:
f.truncate()
def test_yml():
#写⼊yaml⽂件
data = {"str":"12345"}
write_yaml('test.yml',data)
#读取yaml⽂件
ret = read_yaml('test.yml',"str")
print("ret:", ret)
#清空yaml⽂件
clear_yaml('test.yml')