Python YAML 零基础完整教程

Python YAML 零基础完整教程 · Python YAML Guide

Python YAML 零基础完整教程

什么是YAML、安装依赖、基础语法、读写文件、项目实战、常见踩坑

一、什么是 YAML

YAML 全称 YAML Ain’t Markup Language,直译:不是标记语言,是一种人类极易阅读的配置文件格式,后缀一般为 .yaml / .yml

一句话区分:JSON 靠大括号/逗号,YAML 靠缩进和冒号,不用写引号、逗号,可读性更强。

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 标准安装

pip install pyyaml
Windows / Mac / Linux 通用

uv 安装(推荐)

uv add –dev pyyaml
现代Python包管理器,速度更快

验证是否安装成功

python -c “import yaml;print(yaml.__version__)”
输出版本号即安装完成

四、YAML 基础语法(零基础必看)

硬性规则:只能用2/4个空格缩进,禁止Tab制表符;冒号后面必须加空格。

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"])
推荐优先使用 safe_load:避免危险的Python对象序列化漏洞,生产环境禁止使用 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)
dump 参数说明:
  • 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

1. What is YAML

YAML stands for YAML Ain’t Markup Language, a human-readable config file format with extension .yml / .yaml.

Key difference from JSON: YAML uses indentation instead of braces/commas, cleaner for long configs.

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

Hard rule: Use 2/4 spaces for indent, NO Tab characters; add space after colon :.

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()