灵活运用yaml格式配置你的python项目

Python开发时常用的配置文件后缀是.ini、.conf、.py、.json,今天风云要介绍的 .yaml 是当下最推荐的配置文件格式。容易阅读和修改,支持注释,且支持丰富的数据类型。

YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,广泛用于配置文件、数据交换和存储。Python 中的 yaml 库提供了对 YAML 格式的解析和生成支持。

1. YAML 库的功能

yaml 库的主要功能包括:

解析 YAML 文件:将 YAML 格式的字符串或文件解析为 Python 对象(如字典、列表等)。

生成 YAML 文件:将 Python 对象序列化为 YAML 格式的字符串或文件。

支持复杂数据结构:YAML 支持嵌套的字典、列表、标量值等复杂数据结构。

自定义标签和类型:允许用户定义自定义标签和类型,扩展 YAML 的功能。

2. YAML 库的安装

yaml 库通常通过 PyYAML 包提供。可以使用 pip 安装:

pip install pyyaml

3. YAML 库的用法

3.1 解析 YAML 文件

将 YAML 文件或字符串解析为 Python 对象:

import yaml


# 从字符串解析
yaml_str = """
    name: John Doe
    age: 30
    hobbies:
      - Reading
      - Hiking
"""

data = yaml.safe_load(yaml_str)
print(data)

# 输出: {'name': 'John Doe', 'age': 30, 'hobbies': ['Reading', 'Hiking']}

# 从文件解析
with open('example.yaml', 'r') as file:
    data = yaml.safe_load(file)
    print(data)
3.2 生成 YAML 文件

将 Python 对象序列化为 YAML 格式的字符串或文件:

import yaml


data = {
    'name': 'John Doe',
    'age': 30,
    'hobbies': ['Reading', 'Hiking']
}

# 生成 YAML 字符串
yaml_str = yaml.dump(data)
print(yaml_str)

# 输出:
# name: John Doe
# age: 30
# hobbies:
#   - Reading
#   - Hiking

# 写入 YAML 文件
with open('output.yaml', 'w') as file:
    yaml.dump(data, file)
3.3 自定义标签和类型

YAML 支持自定义标签,允许用户定义特定类型的解析和生成规则:

import yaml


# 定义自定义标签
def custom_constructor(loader, node):
    return node.value

yaml.add_constructor('!custom', custom_constructor)

# 使用自定义标签
yaml_str = """
    value: !custom "example"
"""

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

# 输出: {'value': 'example'}

4. YAML 库的优点和特色

4.1 优点

人类可读:YAML 的语法简洁明了,易于阅读和编写。

跨语言支持:YAML 是一种通用的数据格式,支持多种编程语言。

支持复杂数据结构:YAML 支持嵌套的字典、列表、标量值等复杂数据结构。

灵活性:YAML 支持自定义标签和类型,扩展性强。

4.2 特色

缩进表示层次:YAML 使用缩进来表示数据的层次结构,类似于 Python 的语法。

多种数据类型:YAML 支持字符串、整数、浮点数、布尔值、日期等多种数据类型。

锚点和引用:YAML 支持锚点和引用,避免重复数据。

5. YAML 库的应用场景

5.1 配置文件

YAML 广泛用于配置文件,如 Docker Compose、Kubernetes、Ansible 等工具的配置文件。

# Docker Compose 配置文件示例

version: '3'

services:
  web:
    image: nginx
    ports:
      - "80:80"

  db:
    image: postgres

    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
5.2 数据交换

YAML 可以用于不同系统之间的数据交换,如 API 请求和响应的数据格式。

5.3 测试数据

YAML 可以用于存储测试数据,便于测试脚本读取和使用。

# 测试数据示例
test_cases:
  - input: 1
    expected_output: 2

  - input: 2
    expected_output: 4
5.4 文档生成

YAML 可以用于生成文档,如 Swagger API 文档。

# Swagger API 文档示例
swagger: '2.0'

info:
  title: Sample API
  version: 1.0.0paths:

  /users:
    get:
      summary: Get all users

      responses:
        '200':
          description: OK

6. YAML 库的注意事项

6.1 安全性

避免使用 yaml.load:yaml.load 可以执行任意代码,存在安全风险。建议使用 yaml.safe_load 或 yaml.full_load。

验证输入数据:在解析 YAML 文件时,应验证输入数据的合法性,避免注入攻击。

6.2 性能

大文件处理:对于较大的 YAML 文件,解析和生成可能会占用较多内存和时间,需注意性能优化。

6.3 语法规范

缩进一致性:YAML 对缩进要求严格,需确保缩进一致,避免解析错误。

数据类型转换:YAML 会自动推断数据类型,可能导致意外的类型转换,需注意数据类型的准确性。

7. 示例代码

7.1 解析复杂 YAML 文件
# example.yaml
person:
  name: John Doe
  age: 30
  address:
    street: 123 Main St
    city: Anytown
    state: CA

  hobbies:
    - Reading
    - Hiking



import yaml

with open('example.yaml', 'r') as file:
    data = yaml.safe_load(file)
    print(data['person']['name'])  # 输出: John Doe
    print(data['person']['hobbies'])  # 输出: ['Reading', 'Hiking']
7.2 生成复杂 YAML 文件
import yaml



data = {
    'person': {
        'name': 'Jane Doe',
        'age': 25,
        'address': {
            'street': '456 Elm St',
            'city': 'Othertown',
            'state': 'NY'
        },

        'hobbies': ['Swimming', 'Cycling']
    }
}

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

最后,看看风云的项目配置案例

YAML 是一种灵活且易于阅读的数据序列化格式,yaml 库为 Python 提供了强大的 YAML 解析和生成功能。通过掌握 yaml 库的使用方法,开发者可以高效地处理配置文件、数据交换和测试数据等任务。在实际应用中,需注意安全性、性能和语法规范,以确保数据的准确性和系统的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek 指导手册(入门到精通)

第⼀章:准备篇(三分钟上手)1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章:基础对话篇(像交朋友⼀样学交流)2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章:效率飞跃篇&…

Tcp_socket

Tcp不保证报文完整性(面向字节流) 所以我们需要在应用层指定协议,确保报文完整性 // {json} -> len\r\n{json}\r\n bool Encode(std::string &message) {if(message.size() 0) return false;std::string package std::to_string(m…

激光工控机在精密制造中的应用与优势

在精密制造中,激光工控机可以用于许多场景例如 激光切割与雕刻:用于金属、塑料、陶瓷等材料的精密切割和雕刻,适用于汽车、航空航天、电子等行业;可实现复杂图案和高精度加工,满足微米级精度要求。 激光焊接&#xf…

基于微型5G网关的石化厂区巡检机器人应用

石化工业属于高风险产业,由于涉及易燃易爆、有毒有害工业原料,为了保障企业的安全生产与持续运营,因此相比其它行业需要进行更高频次、更全面细致的安全巡检和监测。由于传统的人工巡检监测存在诸多不便,例如工作强度大、现场环境…

WebP2P+自研回音消除:视频通话SDK嵌入式EasyRTC构建高交互性音视频应用

随着移动互联网时代的到来,手机端的扬声器大多采用外置设计,且音量较大。在这种情况下,扬声器播放的声音更容易被麦克风捕捉,从而导致回声问题显著加剧。这种设计虽然方便用户在免提模式下使用,但也带来了更复杂的音频…

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC 在先前 分别介绍了FatFS文件系统和USB虚拟U盘MSC配置 前者通过MCU读写Flash建立文件系统 后者通过MSC连接电脑使其能够被操作 这两者可以合起来 就能够实现同时在MCU、USB中操作Flash的文件系统 【STM32】通过…

飞书专栏-TEE文档

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573

【gRPC-gateway】auth-通过拦截器从上下文中提取元数据用于认证,与从http header转发待认证数据到上下文进行验证,go案例

从grpc上下文中提取元数据用于认证 案例 interceptor.go package serverimport ("context""errors""google.golang.org/grpc""google.golang.org/grpc/metadata""strings" )// UnaryInterceptor 是一个 unary RPC 的拦截器…

win11 终端乱码导致IDE 各种输出也乱码

因为 win11 终端乱码导致IDE 各种输出也乱码导致作者对此十分头大。所以研究了各种方法。 单独设置终端编码对 HKEY_CURRENT_USER\Console 注册表进行修改对 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processo 注册表进行修改使用命令[Console]::OutputEncoding [Syst…

deepseek+kimi一键生成PPT

1、deepseek生成大纲内容 访问deepseek官方网站:https://www.deepseek.com/ 将你想要编写的PPT内容输入到对话框,点击【蓝色】发送按钮,让deepseek生成内容大纲,并以markdown形式输出。 等待deepseek生成内容完毕后&#xff0c…

从零搭建:Canal实时数据管道打通MySQL与Elasticsearch

Canal实时同步Mysql Binlog至 Elasticsearch 文章目录 Canal实时同步Mysql **Binlog**至**Elasticsearch** 一. 环境准备1.环境检查检查Mysql是否开启BinLog开启Mysql BinlogJava环境检查 2.新建测试库和表3.新建Es索引 二.**部署 Canal Server****2.1 解压安装包****2.2 配置 …

Excel 合并列数据

场景 要求每行数据的每个字段的内容不能以 [2,3,33,22] 形式展示 要求独立成列形式如下 代码 maven 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>…

从零到一:基于Rook构建云原生Ceph存储的全面指南(下)

接上篇&#xff1a;《从零到一&#xff1a;基于Rook构建云原生Ceph存储的全面指南&#xff08;上&#xff09;》 链接: link 六.Rook部署云原生CephFS文件系统 6.1 部署cephfs storageclass cephfs文件系统与RBD服务类似&#xff0c;要想在kubernetes pod里使用cephfs&#…

人工智能之深度学习的革命性突破

深度学习的革命性突破 深度学习是机器学习的一个子领域&#xff0c;通过模拟人脑神经网络的结构和功能&#xff0c;实现对复杂数据的高效处理。近年来&#xff0c;深度学习在计算机视觉、自然语言处理、语音识别等领域取得了革命性突破。本文将深入探讨深度学习的核心架构、突…

C#快速排序QuickSort将递归算法修改为堆栈Stack非递归方式

我们知道,方法的调用是采用Stack的方式[后进先出:LIFO], 在DeepSeek中快速搜索C#快速排序, 搜索结果如图: 我们会发现是采用递归的方式 . 递归的优点: 简单粗暴,类似于直接写数学公式,因代码量较少,易于理解.递归与循环迭代的运行次数都是一致的 递归的缺点: 占用大量的内…

Django开发入门 – 3.用Django创建一个Web项目

Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境&#xff0c;以及创建第一个Django Web应用项目&#xff0c;并能够运行Django Web服务器。 创建该Django项目需…

SQL布尔盲注、时间盲注

一、布尔盲注 布尔盲注&#xff08;Boolean-based Blind SQL Injection&#xff09;是一种SQL注入技术&#xff0c;用于在应用程序不直接显示数据库查询结果的情况下&#xff0c;通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…

【Python网络爬虫】爬取网站图片实战

【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…

【docker知识】快速找出服务器中占用内存较高的容器

本文由Markdown语法编辑器编辑完成。 1.背景&#xff1a; 近期在处理现场问题&#xff0c;观察服务器时&#xff0c;会遇到某些进程占用较高内存的情况。由于我们的服务&#xff0c;基本上都是以容器的方式在运行&#xff0c;因此就需要找到&#xff0c;到底是哪个容器&#…

图数据库neo4j进阶(一):csv文件导入节点及关系

CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…