PyYAML SafeLoader的使用小结

 更新时间:2026年03月22日 10:21:25   作者:Yorlen_Zhang  
yaml.SafeLoader 是处理配置文件的黄金标准,它在保证安全的同时提供了完整的 YAML 功能支持,下面就来介绍一下PyYAML SafeLoader如何使用,感兴趣的可以了解一下

yaml.SafeLoader是 PyYAML 库中最推荐使用的 YAML 解析器,它在功能性和安全性之间取得了完美平衡。本文将深入介绍其核心特性、使用方法及最佳实践。

一、为什么选择 SafeLoader?

PyYAML 提供了多种 Loader,但 SafeLoader 是生产环境的首选:

Loader 类型安全性功能支持适用场景
SafeLoader⭐⭐⭐ 高基础类型生产环境首选
FullLoader⭐⭐ 中大部分 Python 对象受信任文件
UnsafeLoader⭐ 低任意 Python 对象避免使用
Loader (默认)⭐ 低同 UnsafeLoader已废弃

核心优势:

  • 安全性:禁止执行任意 Python 代码,防范反序列化攻击
  • 标准兼容:完整支持 YAML 1.1 规范
  • 类型安全:仅解析基本数据类型(字典、列表、字符串、数字等)

二、基础使用方法

1. 基本加载

import yaml

# 方法1:显式指定 SafeLoader(推荐)
with open('config.yaml', 'r', encoding='utf-8') as f:
    data = yaml.load(f, Loader=yaml.SafeLoader)

# 方法2:使用安全加载快捷函数(更简洁)
with open('config.yaml', 'r', encoding='utf-8') as f:
    data = yaml.safe_load(f)  # 内部使用 SafeLoader

# 字符串加载
yaml_text = """
name: 张三
age: 28
skills:
  - Python
  - YAML
"""
data = yaml.safe_load(yaml_text)
print(data)

# {'name': '张三', 'age': 28, 'skills': ['Python', 'YAML']}

2. 多文档处理

# 处理多个 YAML 文档(--- 分隔)
multi_doc = """
---
name: 文档1
value: 100
---
name: 文档2
value: 200
"""
# 生成器方式遍历所有文档
for doc in yaml.safe_load_all(multi_doc):
    print(doc)

三、支持的 YAML 类型映射

SafeLoader 将 YAML 类型安全地转换为 Python 对象:

YAML 类型Python 类型示例
映射 (Mapping)dictkey: value
序列 (Sequence)list- item1
字符串 (Str)str"text" 或 text
整数 (Int)int42, 0x2A
浮点数 (Float)float3.14, 6.02e23
布尔值 (Bool)booltrue, false
空值 (Null)Nonenull, ~
时间戳 (Timestamp)datetime.datetime2024-01-15
二进制 (Binary)bytes!!binary "SGVsbG8="

⚠️ 不支持的危险类型(被安全限制):

  • !!python/object - 任意 Python 对象
  • !!python/module - 模块导入
  • !!python/execute - 代码执行

四、高级配置与自定义

1. 自定义构造器(安全扩展)

import yaml
from yaml import SafeLoader

# 添加自定义标签处理(保持安全边界)
class MySafeLoader(SafeLoader):
    pass

# 注册自定义构造器
def constructor_env_variable(loader, node):
    value = loader.construct_scalar(node)
    return os.path.expandvars(value)  # 展开环境变量

# 注册 !!env 标签
MySafeLoader.add_constructor('!env', constructor_env_variable)

# 使用自定义 Loader
yaml_text = "path: !env $HOME/config"
data = yaml.load(yaml_text, Loader=MySafeLoader)

2. 安全加载与验证结合

from pydantic import BaseModel
import yaml

class Config(BaseModel):
    name: str
    port: int
    debug: bool = False

# 安全加载 + 模式验证
with open('config.yaml') as f:
    raw_data = yaml.safe_load(f)
    config = Config(**raw_data)  # 验证类型安全

五、常见陷阱与解决方案

陷阱 1:隐式类型转换

# 危险:version 会被解析为字符串 "1.10" 还是数字?
version: 1.10      # 实际解析为浮点数 1.1
date: 2024-01-15  # 解析为日期对象,不是字符串!

解决方案:

# 强制字符串类型
version: !!str 1.10
date: !!str 2024-01-15

陷阱 2:YAML 别名循环引用

# 无限递归定义(SafeLoader 可安全处理,但需注意)
person: &anchor
  name: 张三
  friend: *anchor  # 循环引用

处理:

# SafeLoader 会正确解析为自引用对象
# 使用 copy.deepcopy 时需设置最大深度防栈溢出
import copy
data = yaml.safe_load(yaml_text)
safe_copy = copy.deepcopy(data)  # 可能抛出 RecursionError

六、最佳实践总结

  • 永远使用 safe_load:替代 load() 避免安全风险
  • 显式声明字符串:对版本号、电话号码等使用 !!str 强制类型
  • 限制文件权限:YAML 配置文件应只读(chmod 644)
  • 输入验证:加载后使用 Pydantic 或 JSON Schema 验证结构
  • 错误处理:捕获 yaml.YAMLError 解析异常
import yaml
from yaml import YAMLError
try:
    with open('config.yaml', 'r', encoding='utf-8') as f:
        config = yaml.safe_load(f)
except YAMLError as e:
    print(f"YAML 解析错误: {e}")
except FileNotFoundError:
    print("配置文件不存在")

yaml.SafeLoader 是处理配置文件的黄金标准,它在保证安全的同时提供了完整的 YAML 功能支持,是现代 Python 项目的必备工具。

到此这篇关于PyYAML SafeLoader的使用小结的文章就介绍到这了,更多相关PyYAML SafeLoader 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python解析微信dat文件的方法

    Python解析微信dat文件的方法

    这篇文章主要介绍了Python解析微信dat文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 关于tensorflow和keras版本的对应关系

    关于tensorflow和keras版本的对应关系

    这篇文章主要介绍了关于tensorflow和keras版本的对应关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 一文详解如何用GPU来运行Python代码

    一文详解如何用GPU来运行Python代码

    前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐,感兴趣的小伙伴快跟随小编一起了解一下吧
    2023-02-02
  • python 普通克里金(Kriging)法的实现

    python 普通克里金(Kriging)法的实现

    这篇文章主要介绍了python 普通克里金(Kriging)法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • pytorch之scatter_的用法及说明

    pytorch之scatter_的用法及说明

    这篇文章主要介绍了pytorch之scatter_的用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 如何在python中使用openpyxl库读写Excel.xlsx文件(有参考列程)

    如何在python中使用openpyxl库读写Excel.xlsx文件(有参考列程)

    这篇文章主要给大家介绍了关于如何在python中使用openpyxl库读写Excel.xlsx文件的相关资料,openpyxl是一个第三方库,可以处理xlsx格式的Excel文件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • 使用Python实现Excel文件转换为SVG格式

    使用Python实现Excel文件转换为SVG格式

    SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,这种格式在Web开发和其他图形应用中非常流行,提供了一种高效的方式来呈现复杂的矢量图形,本文将介绍如何使用Python转换Excel文件为SVG格式,需要的朋友可以参考下
    2024-07-07
  • Python 面向对象 成员的访问约束

    Python 面向对象 成员的访问约束

    在Java,C++,以及PHP中都有对应的关键字,public,protected,private,但是在Python中却没有这些关键字来声明类成员的访问作用域。
    2008-12-12
  • 对Python2与Python3中__bool__方法的差异详解

    对Python2与Python3中__bool__方法的差异详解

    今天小编就为大家分享一篇对Python2与Python3中__bool__方法的差异详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 解决Python 异常TypeError: cannot concatenate ''str'' and ''int'' objects

    解决Python 异常TypeError: cannot concatenate ''str'' and ''int''

    这篇文章主要介绍了解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论