Python YAML 零基础完整教程
什么是YAML、安装依赖、基础语法、读写文件、项目实战、常见踩坑
目录
一、什么是 YAML
YAML 全称 YAML Ain’t Markup Language,直译:不是标记语言,是一种人类极易阅读的配置文件格式,后缀一般为 .yaml / .yml。
YAML 核心特点
极简无冗余 不需要大括号、逗号、引号
层级清晰 使用空格缩进区分父子层级(不能用Tab)
多语言通用 Python/Java/Go/前端/容器都支持
主流配置标准 Docker、K8s、FastAPI、爬虫、AI项目全部在用
二、YAML 适用场景
- 程序配置文件(数据库地址、端口、账号密码、开关)
- 容器编排:Kubernetes 资源定义
- CI/CD流水线:GitHub Actions、GitLab CI
- 爬虫、AI训练、FastAPI后端项目参数管理
- 静态网站、文档项目参数配置
JSON(繁琐)
{
"server": {
"host": "127.0.0.1",
"port": 8000
}
}
YAML(简洁)
server: host: 127.0.0.1 port: 8000
三、Python 安装 pyyaml
Python 原生不自带YAML解析库,需要安装第三方包pyyaml。
pip 标准安装
uv 安装(推荐)
验证是否安装成功
四、YAML 基础语法(零基础必看)
4.1 键值对(字典,对应Python dict)
# config.yml name: 小明 age: 22 is_student: true score: 95.5 address: null
对应Python类型:字符串、数字、布尔、浮点数、None
4.2 列表(数组,对应Python list)
短横线 - 开头代表列表元素
# 普通列表 hobbies: - 篮球 - 看书 - 编程 # 行内简写列表 nums: [1,2,3,4]
4.3 嵌套字典(多层配置,最常用)
database:
host: 127.0.0.1
port: 3306
user: root
password: 123456
pool:
max_size: 20
min_size: 5
4.4 多行文本
# | 保留换行 desc: | 第一行文字 第二行文字 第三行 # > 自动合并换行 text: > 这是一段很长的说明 换行仅为美观 读取后会合并成一行
4.5 注释
# 开头整行注释,不能写在行尾键值后面
# 服务配置 server: port: 8000 # 错误:行尾不支持注释
五、Python 读取 YAML 文件
5.1 准备配置文件 config.yml
app: name: PythonDemo debug: true server: host: 0.0.0.0 port: 8000 db: user: root pwd: 123456
5.2 读取代码(safe_load 安全方式)
import yaml
# 打开yaml文件读取
with open("config.yml", "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
# data 是标准Python字典dict
print(data["app"]["name"])
print(data["server"]["port"])
print(data["db"]["user"])
# 单独读取某一层
server_config = data["server"]
print(server_config["host"])
yaml.load()。
六、Python 写入/修改 YAML 文件
6.1 写入全新YAML文件
import yaml
# Python字典数据
cfg = {
"app": {"name": "TestApp", "debug": False},
"server": {"port": 9000, "host": "127.0.0.1"}
}
# 写入文件,sort_keys=False 不自动排序键
with open("new_config.yml", "w", encoding="utf-8") as f:
yaml.dump(cfg, f, sort_keys=False, allow_unicode=True)
6.2 修改已有YAML配置
import yaml
# 1.读取原有配置
with open("config.yml", "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
# 2.修改参数
data["server"]["port"] = 8080
data["app"]["debug"] = False
# 3.写回原文件
with open("config.yml", "w", encoding="utf-8") as f:
yaml.dump(data, f, sort_keys=False, allow_unicode=True)
sort_keys=False:保持原有键顺序,不自动排序allow_unicode=True:正常显示中文,不会转义\uXXXX
七、safe_load 安全机制说明
为什么不能直接用 yaml.load()?
原始 yaml.load() 支持反序列化任意Python对象,如果外部恶意YAML文件注入危险代码,会导致服务器被入侵。
safe_load() 仅解析基础类型:dict/list/str/int/bool/None,屏蔽所有可执行对象,生产环境强制使用。
❌ 危险写法(废弃)
yaml.load(f)
官方标记不安全,新版本会抛出警告
✅ 标准安全写法
yaml.safe_load(f)
所有项目统一使用
八、完整实战案例:后端项目配置管理
步骤1:创建 config/app.yml
# 项目全局配置 env: dev log_level: INFO # 数据库配置 mysql: host: 127.0.0.1 port: 3306 database: test_db user: root password: "123456" pool_size: 10 # 跨域允许域名 cors_origins: - http://localhost:3000 - https://xxx.com
步骤2:封装读取配置工具 config_loader.py
import os
import yaml
def load_config(yaml_path="config/app.yml"):
"""通用加载YAML配置函数"""
if not os.path.exists(yaml_path):
raise FileNotFoundError(f"配置文件不存在:{yaml_path}")
with open(yaml_path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
# 全局单例配置
config = load_config()
if __name__ == "__main__":
# 测试读取
print("当前环境:", config["env"])
print("数据库地址:", config["mysql"]["host"])
print("跨域列表:", config["cors_origins"])
步骤3:其他文件直接导入使用
from config_loader import config
# 直接使用配置
db_host = config["mysql"]["host"]
db_port = config["mysql"]["port"]
print(f"连接数据库 {db_host}:{db_port}")
九、高频报错与解决办法
| 报错现象 | 原因 | 解决方案 |
|---|---|---|
| yaml.scanner.ScannerError | Tab缩进 / 冒号后无空格 | 全部替换为2/4空格,key: 后加空格 |
| UnicodeDecodeError | 读取文件未指定utf-8 | open(…, encoding=”utf-8″) |
| 中文变成 \uXXXX 转义字符 | dump未加allow_unicode=True | yaml.dump(…, allow_unicode=True) |
| DeprecationWarning: yaml.load() unsafe | 使用了不安全load方法 | 替换为 yaml.safe_load() |
| KeyError: xxx | YAML无对应键名、缩进层级错误 | 检查yaml缩进与键名拼写 |
十、核心总结速查表
YAML + Python 核心口诀
1. 安装依赖:pip install pyyaml
2. 语法规则:空格缩进,冒号后空格,禁止Tab
3. 读取文件:yaml.safe_load(文件对象)
4. 写入文件:yaml.dump(data, f, sort_keys=False, allow_unicode=True)
5. 安全规范:永远不用 yaml.load()
6. 数据映射:YAML字典→Python dict;列表→Python list
Python YAML Complete Beginner Guide
What is YAML, install pyyaml, syntax, read/write yaml file, real project demo
Table of Contents
1. What is YAML
YAML stands for YAML Ain’t Markup Language, a human-readable config file format with extension .yml / .yaml.
Core Advantages
Clean syntax No curly braces, commas or mandatory quotes
Hierarchy clear Indent with spaces only
Cross-language Python, Go, JS, Java, Kubernetes all support
Industry standard Backend, DevOps, ML training config
2. Common Use Cases
- Application config (DB address, port, credentials, feature switches)
- Kubernetes manifest, Docker Compose
- CI/CD workflow (GitHub Actions, GitLab CI)
- FastAPI, Scrapy, Machine Learning training parameters
3. Install pyyaml
# pip install pip install pyyaml # verify install python -c "import yaml; print(yaml.__version__)"
4. Basic YAML Syntax Rules
:.
Key-value mapping (Python dict)
username: Alice age: 24 enabled: true score: 92.5 remark: null
List / Array (Python list)
skills: - python - yaml - docker inline_list: [10,20,30]
Nested dict
database:
host: 127.0.0.1
port: 5432
pool:
max: 15
5. Read YAML File
import yaml
with open("config.yml", "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
print(data["database"]["host"])
6. Write & Update YAML
import yaml
data = {"server": {"port": 8000, "debug": False}}
with open("output.yml", "w", encoding="utf-8") as f:
yaml.dump(data, f, sort_keys=False, allow_unicode=True)
7. safe_load Security
yaml.load() is unsafe, it can deserialize arbitrary Python objects and cause remote code execution attacks.
Always use yaml.safe_load() in production, only parses basic types (dict, list, str, int, bool, None).
8. Full Project Demo
# config_loader.py
import os, yaml
def load_config(path="config/app.yml"):
if not os.path.exists(path):
raise FileNotFoundError("Config missing")
with open(path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
cfg = load_config()
9. Common Errors
- ScannerError: Tab indent / missing space after colon
- UnicodeDecodeError: missing encoding=”utf-8″
- Unicode escape characters: add allow_unicode=True in dump
- DeprecationWarning: replace load() with safe_load()
10. Quick Reference
Core Cheat Sheet
Install: pip install pyyaml
Read: yaml.safe_load(file)
Write: yaml.dump(data, f, sort_keys=False, allow_unicode=True)
Safety: Never use raw yaml.load()
