Python YAML处理神器: ruamel.yaml 和 ruamel.yaml.clib 详解

Python YAML处理神器: ruamel.yaml 和 ruamel.yaml.clib 详解

    • 1. ruamel.yaml 简介
    • 2. ruamel.yaml.clib 简介
    • 3. 安装
    • 4. 基本使用
      • 4.1 读取YAML文件
      • 4.2 写入YAML文件
    • 5. 高级特性
      • 5.1 保留注释和结构
      • 5.2 不同的YAML样式
      • 5.3 使用ruamel.yaml.clib提升性能
    • 6. 高级用法
      • 6.1 自定义标签
      • 6.2 处理多文档YAML
    • 7. 性能比较
    • 8. 总结

YAML (YAML Ain’t Markup Language) 是一种人类可读的数据序列化格式,在配置文件、数据交换等场景中广泛使用。Python中处理YAML的库有很多,其中ruamel.yaml以其强大的功能和高性能而脱颖而出。本文将详细介绍ruamel.yaml及其C语言扩展ruamel.yaml.clib的使用方法和基本概念。

1. ruamel.yaml 简介

ruamel.yaml是一个功能丰富的YAML解析器和编码器,它是PyYAML的一个分支,提供了更多的功能和改进。

主要特点:

  • 支持YAML 1.2规范
  • 保留注释和文件结构
  • 支持多种YAML样式(块样式、流样式等)
  • 提供更好的Unicode支持
  • 可以通过ruamel.yaml.clib获得更高的性能

2. ruamel.yaml.clib 简介

ruamel.yaml.clib是ruamel.yaml的C语言扩展,提供了更高效的YAML解析和编码功能。它主要用于提升ruamel.yaml的性能,特别是在处理大型YAML文件时。

3. 安装

使用pip安装ruamel.yaml和ruamel.yaml.clib:

pip install ruamel.yaml ruamel.yaml.clib

注意: ruamel.yaml.clib是可选的,但强烈建议安装以获得更好的性能。

4. 基本使用

4.1 读取YAML文件

from ruamel.yaml import YAMLyaml = YAML()
with open('config.yaml', 'r') as file:data = yaml.load(file)print(data)

4.2 写入YAML文件

from ruamel.yaml import YAMLyaml = YAML()
data = {'name': 'John', 'age': 30, 'city': 'New York'}with open('output.yaml', 'w') as file:yaml.dump(data, file)

5. 高级特性

5.1 保留注释和结构

ruamel.yaml的一个重要特性是能够保留YAML文件中的注释和结构:

from ruamel.yaml import YAMLyaml = YAML()
yaml.preserve_quotes = Trueyaml_str = """
# User configuration
user:name: John Doe  # Full nameage: 30  # Age in years
"""data = yaml.load(yaml_str)
# 修改数据
data['user']['age'] = 31# 输出修改后的YAML
print(yaml.dump(data))

输出将保留原始注释和结构。

5.2 不同的YAML样式

ruamel.yaml支持多种YAML样式:

from ruamel.yaml import YAMLdata = {'colors': ['red', 'green', 'blue'], 'numbers': [1, 2, 3]}# 块样式
yaml_block = YAML()
yaml_block.default_flow_style = False# 流样式
yaml_flow = YAML()
yaml_flow.default_flow_style = Trueprint("块样式:")
yaml_block.dump(data, sys.stdout)print("\n流样式:")
yaml_flow.dump(data, sys.stdout)

5.3 使用ruamel.yaml.clib提升性能

ruamel.yaml.clib会自动被ruamel.yaml使用,无需特殊配置。但在某些情况下,您可能需要确保它被正确安装和使用:

import ruamel.yaml# 检查是否使用了C扩展
print("Using C extensions:", ruamel.yaml.__with_libyaml__)

6. 高级用法

6.1 自定义标签

ruamel.yaml支持自定义YAML标签:

from ruamel.yaml import YAML, SafeConstructorclass MyConstructor(SafeConstructor):def construct_ruby(self, node):return f"Ruby: {node.value}"yaml = YAML()
yaml.Constructor = MyConstructoryaml.constructor.add_constructor('!ruby', yaml.Constructor.construct_ruby)yaml_str = """
language: !ruby Ruby
"""data = yaml.load(yaml_str)
print(data['language'])  # 输出: Ruby: Ruby

6.2 处理多文档YAML

ruamel.yaml可以处理包含多个文档的YAML文件:

from ruamel.yaml import YAMLyaml = YAML()
yaml_str = """
---
document: 1
---
document: 2
"""docs = list(yaml.load_all(yaml_str))
print(docs)  # 输出: [{'document': 1}, {'document': 2}]

7. 性能比较

在处理大型YAML文件时,ruamel.yaml.clib可以显著提升性能。以下是一个简单的性能比较:

import timeit
import ruamel.yamldef test_yaml_load():yaml = ruamel.yaml.YAML()with open('large_file.yaml', 'r') as file:data = yaml.load(file)# 使用C扩展
print("With C extension:", timeit.timeit(test_yaml_load, number=100))# 禁用C扩展
ruamel.yaml.__with_libyaml__ = False
print("Without C extension:", timeit.timeit(test_yaml_load, number=100))

通常,使用C扩展会带来显著的性能提升。

8. 总结

ruamel.yaml和ruamel.yaml.clib为Python开发者提供了强大而灵活的YAML处理工具。它们不仅支持标准的YAML操作,还提供了许多高级特性,如保留注释、支持多种样式等。通过使用ruamel.yaml.clib,我们还能获得更好的性能,特别是在处理大型YAML文件时。

在实际项目中,无论是配置文件管理、数据序列化还是其他需要处理YAML的场景,ruamel.yaml都是一个值得考虑的选择。它的功能丰富性和性能优势使其成为Python YAML处理的理想工具。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPS中制作甘特图的详细教程

网上没几个详细说怎么在WPS中制作甘特图的,我自己整理了一下详细教程,最终效果如下图所示: 1.写好需要展示的项目相关信息,如下图所示: #####这个进度的百分比渐变效果这样设置就行了 2.现在我们需要计算已用时间和剩…

docker安装ElasticSearchKibana

本文参考以下两篇文章 ✅ElasticSearch&Kibana 部署 云效 Thoughts 企业级知识库 (aliyun.com) docker安装ElasticSearch&Kibana - 飞书 安装elasticsearch 使用docker下载es: docker pull elasticsearch:8.13.0 挂载配置 创建挂在文件目录 mkdir…

AI大模型:解锁未来职业竞争力的金钥匙

AI元年:大模型的革新力量 随着ChatGPT的震撼登场,2023年被标记为AI元年,大模型以其前所未有的影响力,重塑我们的日常生活和工作方式。从日常的问答对话到复杂的编程辅助,乃至创意图像生成,AI大模型展现出超…

嵌入式Linux系统编程 — 6.4 信号集

目录​​​​​​​ 1 信号集概念 2 sigemptyset、sigfillset初始化信号集 3 sigaddset、sigdelset向信号集中添加/删除信号 4 sigismember函数测试信号是否在信号集中 1 信号集概念 在Linux系统中,信号集(signal set)用于表示一组信号…

对标GPT-4o!不锁区、支持手机、免费使用,Moshi来啦!

7月4日凌晨,法国知名开源AI研究实验室Kyutai在官网发布了,具备看、听、说多模态大模型——Moshi。 Moshi功能与OpenAI在5月14日展示的最新模型GPT-4o差不多,可以听取人的语音提问后进行实时推理回答内容。但GPT-4o的语音模式要在秋天才能全面…

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList

文章目录 1、确认下单:购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

再次登榜,深兰科技荣膺全球独角兽企业500强

6月27~28日,《2024全球独角兽企业500强》榜单发布,深兰科技凭借在AI产业赋能和产品出海方面的出色表现,继2023年之后再次登榜。 《2024全球独角兽企业500强》评委会介绍,本届榜单的产生,是由“全球独角兽企…

flutter开发实战-Charles抓包设置,dio网络代理

flutter开发实战-Charles抓包设置 在开发过程中抓包,可以看到请求参数等数据,方便分析问题。flutter上使用Charles抓包设置。dio需要设置网络代理。 一、dio设置网络代理 在调试模式下需要抓包调试,所以需要使用代理,并且仅用H…

专利优先权是什么

专利优先权:定义、分类与重要性 在专利的世界中,专利优先权是一个至关重要的概念。它不仅是专利申请人权益的保障,更是确保创新成果得到及时和充分保护的重要工具。 一、专利优先权的定义 专利优先权是指专利申请人就其发明创造第一次在某…

CTF常用sql注入(一)联合注入和宽字节

0x01 前言 给自己总结一下sql注入的常用姿势吧,记录一下学习 0x02 联合 联合注入的关键词是union SQL的union联合注入原理是联合两个表进行注入攻击,使用union select关键词来进行联合查询。 那么为什么我们在题目中一般是只写一个呢 因为 $sql &quo…

java-数据结构与算法-02-数据结构-02-链表

文章目录 1. 概述2. 单向链表3. 单向链表(带哨兵)4. 双向链表(带哨兵)5. 环形链表(带哨兵)6. 习题E01. 反转单向链表-Leetcode 206E02. 根据值删除节点-Leetcode 203E03. 两数相加-Leetcode 2E04. 删除倒数…

基于C++实现的EventLoop与事件驱动编程

一,概念介绍 事件驱动编程(Event-Driven)是一种编码范式,常被应用在图形用户界面,应用程序,服务器开发等场景。 采用事件驱动编程的代码中,通常要有事件循环,侦听事件,…

封装stater时配置导入配置类提示功能

提示功能如下 使用注解导入配置属性时添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

孕产妇健康管理信息平台,多家医院产科广泛运用,系统稳定,功能齐全 产科管理系统源码,三甲医院产科电子病历系统成品源代码

孕产妇健康管理信息平台&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统源码&#xff0c;三甲医院产科电子病历系统成品源代码 女性生育过程会面临许多的困难和问题&#xff0c;需要经常性地前往医院做详细的身心检查&#xff0c;在…

IDEA 一键部署Docker

以部署示例服务&#xff08;sevnce-demo&#xff09;为例。 配置服务器 地址、账号、密码根据实际情况填写 配置镜像仓库 地址、账号、密码根据实际情况填写 编写Dockerfile 在sevnce-demo根目录下右键&#xff0c;选择创建Dockerfile。 # 基础镜像 FROM sevnce-registry.c…

C++:求梯形面积

梯形面积 已知上底15厘米&#xff0c;下底25厘米&#xff0c;问梯形面积值是多少&#xff1f; #include<iostream> using namespace std; int main() {//梯形的面积公式&#xff08;上底下底&#xff09; 高 2//上底变量、下底变量int s,d,h,m;s15;d25;h 2*150 * 2/s ;…

Day04-jenkins-docker

Day04-jenkins-docker 9. 案例06: 基于docker的案例实现静态代码9.1 整体流程9.2 步骤与环境1) 步骤2) 环境 9.3 详细步骤1&#xff09;代码准备2&#xff09;书写dockerfile3&#xff09;准备私有仓库4&#xff09;创建jenkins任务5&#xff09;web节点上启动对应的docker容器…

信息打点web篇---前端js打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理前端js代码的打点思路 本文只为学习安全使用&#xff0c;切勿用于非法用途。 一切未授权的渗透行为都是违法的。 前端js打点概念与目的 javascript文件属于前端语言&#xff0c;也就是说他的代码都…

taoCMS v3.0.2 文件上传漏洞(CVE-2022-23880)

前言 CVE-2022-23880是一个影响taoCMS v3.0.2的任意文件上传漏洞。攻击者可以利用此漏洞通过上传特制的PHP文件在受影响的系统上执行任意代码。 漏洞细节 描述: 在taoCMS v3.0.2的文件管理模块中存在任意文件上传漏洞。攻击者可以通过上传恶意的PHP文件来执行任意代码。 影响…

谷粒商城笔记-03-分布式基础概念

文章目录 一&#xff0c;微服务二&#xff0c;集群、分布式三&#xff0c;远程调用四&#xff0c;负载均衡五&#xff0c;服务注册、服务发现、注册中心六&#xff0c;配置中心七&#xff0c;服务熔断、服务降级1&#xff0c;服务熔断2&#xff0c;服务降级3&#xff0c;区别 八…