PyYAML高级用法全揭秘

 更新时间:2025年04月30日 11:13:40   作者:三带俩王  
YAML是一种可读的数据序列化格式,常用于配置文件、数据交换等场景,本文主要介绍了PyYAML高级用法,具有一定的参考价值,感兴趣的可以了解一下

在 Python 的数据序列化与配置文件处理领域,PyYAML 是一个非常强大的工具。它允许我们在 Python 程序中方便地读取和写入 YAML 格式的数据。在这篇博客中,我们将深入探讨 PyYAML 的高级用法。

一、PyYAML 简介

YAML(Yet Another Markup Language)是一种人类可读的数据序列化格式,常用于配置文件、数据交换等场景。PyYAML 是 Python 对 YAML 格式的实现,它提供了简单而高效的接口来处理 YAML 数据。

二、安装 PyYAML

安装 PyYAML 非常简单,我们可以使用 pip 命令进行安装:

pip install pyyaml

三、基本的读写操作

读取 YAML 文件

以下是一个简单的读取 YAML 文件的示例:

import yaml

with open('example.yaml', 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)
    print(data)

写入 YAML 文件

data = {'name': 'John', 'age': 30, 'hobbies': ['reading', 'coding']}

with open('output.yaml', 'w') as file:
    yaml.dump(data, file)

四、PyYAML 的高级用法

自定义标签(Tags)

定义自定义标签:YAML 允许我们定义自定义标签来表示特定类型的数据。在 PyYAML 中,我们可以通过定义构造函数和表示函数来实现自定义标签。

示例:

    import yaml

    def construct_person(loader, node):
        values = loader.construct_mapping(node)
        return Person(values['name'], values['age'])

    yaml.add_constructor('!Person', construct_person)

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def __repr__(self):
            return f"Person(name={self.name}, age={self.age})"

    yaml_str = """
    -!Person
      name: Alice
      age: 25
    -!Person
      name: Bob
      age: 35
    """

    data = yaml.load(yaml_str, Loader=yaml.FullLoader)
    print(data)

在这个示例中,我们定义了一个名为 !Person 的自定义标签,并实现了相应的构造函数 construct_person。当 PyYAML 解析到 !Person 标签时,它会调用这个构造函数来创建一个 Person 对象。

安全加载(Safe Loading)

避免潜在的安全风险:默认情况下,yaml.load 函数使用 FullLoader,它可以执行任意的 Python 代码,这可能会带来安全风险。为了避免这种情况,我们可以使用 SafeLoader。

示例:

    import yaml

    yaml_str = """
   !!python/object:__main__.EvilClass []
    """
    try:
        data = yaml.load(yaml_str, Loader=yaml.SafeLoader)
    except yaml.constructor.ConstructorError as e:
        print(f"SafeLoader prevented the attack: {e}")

这里,如果我们使用 FullLoader,将会执行恶意代码,但使用 SafeLoader 则会阻止这种情况。

复杂数据结构的处理

嵌套数据:PyYAML 可以轻松处理复杂的嵌套数据结构,如嵌套的字典和列表。

示例:

    import yaml

    yaml_str = """
    company:
      departments:
        - name: IT
          employees:
            - name: Tom
              skills: ['Python', 'Java']
            - name: Jerry
              skills: ['C++', 'JavaScript']
        - name: Finance
          employees:
            - name: Alice
              skills: ['Accounting', 'Finance']
    """

    data = yaml.load(yaml_str, Loader=yaml.FullLoader)
    print(data)

这个示例展示了如何处理包含多层嵌套的公司部门和员工技能数据结构。

引用(References)和锚点(Anchors)

数据复用:YAML 中的锚点和引用可以实现数据的复用,在 PyYAML 中同样可以利用这一特性。

示例:

    import yaml

    yaml_str = """
    defaults: &defaults
      user: 'admin'
      password: '123456'

    server1:
      <<: *defaults
      host: '192.168.1.100'

    server2:
      <<: *defaults
      host: '192.168.1.200'
    """

    data = yaml.load(yaml_str, Loader=yaml.FullLoader)
    print(data)

在这里,我们定义了一个默认的用户和密码(通过锚点 &defaults),然后在 server1 和 server2 中复用了这些默认值(通过引用 *defaults)。

流风格(Flow Style)与块风格(Block Style)

灵活的输出格式:我们可以根据需要控制 YAML 数据的输出格式为流风格或块风格。

示例:

    import yaml

    data = {'name': 'John', 'age': 30, 'hobbies': ['reading', 'coding']}

    # 块风格
    yaml_str_block = yaml.dump(data, default_flow_style=False)
    print(yaml_str_block)

    # 流风格
    yaml_str_flow = yaml.dump(data, default_flow_style=True)
    print(yaml_str_flow)

这展示了如何在输出 YAML 数据时选择不同的风格。

五、总结

PyYAML 是一个功能强大的工具,不仅提供了基本的 YAML 数据读写功能,还具备许多高级特性。通过自定义标签、安全加载、处理复杂数据结构、利用引用和锚点以及控制输出格式等高级用法,我们可以更加灵活、高效地处理 YAML 数据。在实际的项目中,这些高级用法可以帮助我们更好地管理配置文件、实现数据序列化等任务。希望这篇博客能够帮助你深入理解和掌握 PyYAML 的高级用法,在你的 Python 编程之旅中发挥更大的作用。

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

相关文章

  • 详解Python 序列化Serialize 和 反序列化Deserialize

    详解Python 序列化Serialize 和 反序列化Deserialize

    这篇文章主要介绍了详解Python 序列化Serialize 和 反序列化Deserialize的相关资料,序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据,需要的朋友可以参考下
    2017-08-08
  • Python的进程间通信详解

    Python的进程间通信详解

    大家好,本篇文章主要讲的是Python的进程间通信详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Pandas快速合并多张excel表格的两种方法

    Pandas快速合并多张excel表格的两种方法

    最近学习了python遍历目录,下面这篇文章主要给大家介绍了关于Pandas快速合并多张excel表格的两种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • python super用法及原理详解

    python super用法及原理详解

    这篇文章主要介绍了python super用法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 使用Python编排Dockerfile的代码详解

    使用Python编排Dockerfile的代码详解

    docker compose 是 docker 的容器编排工具,它是基于 YAML 配置,YAML 是一种配置文件格式,支持传递环境变量,但是对于复杂的容器编排显得力不从心,于是我便开发这个程序,可以像写程序一样编排 docker,感兴趣的的朋友可以参考下
    2024-08-08
  • Python中asyncio的多种用法举例(异步同步)

    Python中asyncio的多种用法举例(异步同步)

    这篇文章主要给大家介绍了关于Python中asyncio的多种用法,包括顺序执行非异步任务、顺序执行异步任务、并行执行异步任务以及并行执行非异步任务,通过使用asyncio模块,可以有效地提高程序的执行效率,尤其是在处理I/O密集型任务时,需要的朋友可以参考下
    2024-11-11
  • 浅析Python数据处理

    浅析Python数据处理

    本篇文章给大家分享了关于Python数据处理的相关内容以及要点解释,对此知识点有兴趣的朋友可以参考学习下。
    2018-05-05
  • Flask中app.route装饰器参数的使用

    Flask中app.route装饰器参数的使用

    app.route()是Flask框架中用于定义路由的装饰器函数,本文主要介绍了Flask中app.route装饰器参数的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • tensorflow获取变量维度信息

    tensorflow获取变量维度信息

    这篇文章主要为大家详细介绍了tensorflow获取变量维度信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python异步IO的项目实践

    python异步IO的项目实践

    本文主要介绍了python异步IO的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论