YAML 简介
YAML 是一种人类可读的数据序列化语言,最初代表'Yet Another Markup Language',后更正为'YAML Ain't Markup Language'。它主要用于存储配置信息,语法简洁,去除了 JSON 或 XML 中大量的引号和括号。
核心特点
- 缩进敏感:类似 Python,通过空格缩进表示层级,禁用 Tab 键。
- 区分大小写:键名和值严格区分大小写。
- 非编程语言:仅用于数据存储,不具备逻辑执行能力。
数据类型与 JSON 对比
| 类型 | YAML 示例 | JSON 示例 |
|---|---|---|
| 标量 | key: value | {"key": "value"} |
| 列表 | list: |
- item1
- item2 |
{"list": ["item1", "item2"]}| | 映射 | map: sub_key: value |{"map": {"sub_key": "value"}}|
Python 环境配置
在 Python 中使用 YAML 需安装 PyYAML 库。
pip install PyYAML
安装后可通过 pip list 验证。
核心操作实践
1. 写入与追加
向 YAML 文件写入数据时,若文件不存在会自动创建。注意追加模式下的文档分隔问题,通常建议每次写入完整结构或使用多文档流。
import yaml
import os
def write_yaml(filename, data):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="a+") as f:
yaml.safe_dump(data, stream=f, allow_unicode=True)
2. 读取数据
读取时需确保文件存在且格式正确,推荐使用 safe_load 防止反序列化漏洞。
import yaml
import os
def read_yaml(filename, key):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="r") as f:
data = yaml.safe_load(f)
return data[key]
3. 清空文件
直接以写模式打开并截断即可。
import os
def clear_yaml(filename):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="w") as f:
f.truncate()
关键注意事项
- 安全性:务必使用
yaml.safe_load()和yaml.safe_dump(),避免使用yaml.load()以防代码执行风险。 - 编码:显式指定
encoding="utf-8"避免中文乱码。 - 路径:示例默认将文件保存在项目根目录的
data文件夹下,请确保该目录已存在。
完整示例
以下是一个整合了写入、读取和清空的测试脚本:
import yaml
import os
def write_yaml(filename, data):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="a+") as f:
yaml.safe_dump(data, stream=f, allow_unicode=True)
def read_yaml(filename, key):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="r") as f:
data = yaml.safe_load(f)
return data[key]
def clear_yaml(filename):
file_path = os.getcwd() + "/data/" + filename
with open(file_path, encoding="utf-8", mode="w") as f:
f.truncate()
def test_yml():
data = {"str": "12345", "user": "zhangsan", "password": "123456"}
write_yaml('test.yml', data)
ret = read_yaml('test.yml', "str")
print("读取结果:", ret)
clear_yaml('test.yml')
if __name__ == "__main__":
test_yml()


