Python模块之yaml:简化配置与数据解析

37b9658de631a0da2c40e04870c955c6.jpeg

更多Python学习内容:ipengtao.com

YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据传输。在Python中,可以使用PyYAML模块来处理YAML格式的数据。本文将深入介绍PyYAML的基础用法、高级功能以及实际应用场景,以帮助读者更好地利用YAML在项目中简化配置与数据解析。

安装与基础用法

首先,确保已经安装了PyYAML模块,可以通过以下命令进行安装:

pip install pyyaml

安装完成后,将深入介绍PyYAML的基础用法。首先,加载一个YAML文件并访问其中的数据:

import yaml# 从YAML文件加载数据
with open("example.yaml", "r") as file:data = yaml.load(file, Loader=yaml.FullLoader)print(data)

上述代码使用yaml.load函数加载了一个YAML文件,其中Loader=yaml.FullLoader用于选择完整的加载器。

将Python对象转为YAML格式:

import yaml# 将Python对象转为YAML格式
python_object = {'name': 'John', 'age': 30, 'city': 'New York'}
yaml_data = yaml.dump(python_object)
print(yaml_data)

这段代码使用yaml.dump函数将一个Python字典转为YAML格式的字符串。

高级功能与参数解析

在使用PyYAML的高级功能时,可以通过一些参数和技巧来处理更为复杂的数据结构。以下是一些高级功能和参数解析的示例:

1. 自定义标签

import yaml# 定义一个自定义标签的构造器
def custom_constructor(loader, node):return f"Custom Tag: {node.value}"# 添加自定义标签的构造器
yaml.add_constructor('!custom_tag', custom_constructor)# 使用自定义标签
data = yaml.load('custom_data: !custom_tag example', Loader=yaml.FullLoader)
print(data)

在上述代码中,定义了一个自定义标签的构造器custom_constructor,并通过yaml.add_constructor方法将其与标签!custom_tag关联。然后,我们在YAML数据中使用了这个自定义标签。

2. Anchor与Alias

import yaml# 创建一个带有锚点的数据结构
data = {'&anchor1': {'name': 'John', 'age': 30}, '*alias1': None}# 将数据转为YAML格式
yaml_data = yaml.dump(data)
print(yaml_data)# 加载带有锚点和别名的YAML数据
loaded_data = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(loaded_data)

上述代码中,创建了一个带有锚点和别名的数据结构,并通过yaml.dump方法将其转为YAML格式。在加载时,yaml.load方法能够正确处理锚点和别名,保持数据结构的一致性。

3. 多文档处理

import yaml# 使用多文档YAML格式
yaml_data = """
- name: Johnage: 30
- name: Aliceage: 25
"""# 加载多文档YAML数据
loaded_data = list(yaml.load_all(yaml_data, Loader=yaml.FullLoader))
print(loaded_data)

在上述代码中,使用了多文档的YAML格式,通过yaml.load_all方法加载了多个文档。这对于处理包含多个独立数据块的YAML文件非常有用。

实际应用场景

在实际项目中,PyYAML可以应用于多种场景,以下是一些具体的应用案例:

1. 配置文件的读写

import yaml# 定义配置数据
config_data = {'database': {'host': 'localhost', 'port': 3306, 'username': 'user', 'password': 'pass'}}# 将配置数据写入YAML文件
with open('config.yaml', 'w') as file:yaml.dump(config_data, file)# 从YAML文件读取配置数据
with open('config.yaml', 'r') as file:loaded_config = yaml.load(file, Loader=yaml.FullLoader)print(loaded_config)

在这个例子中,将配置数据写入YAML文件,并通过yaml.load方法从文件中读取配置数据。这种方式使得配置文件的管理更为直观和易于维护。

2. 数据传递与解析

import yaml# 定义复杂数据结构
data = {'users': [{'name': 'John', 'age': 30}, {'name': 'Alice', 'age': 25}]}# 将数据转为YAML格式字符串
yaml_data = yaml.dump(data)
print(yaml_data)# 从YAML格式字符串解析数据
loaded_data = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(loaded_data)

在这个例子中,将复杂的数据结构转为YAML格式字符串,并通过yaml.load方法解析。这在数据传递和解析过程中提供了一种清晰且可读性强的方式。

3. 配置文件的动态生成

import yaml# 通过代码动态生成配置文件
config_data = {'api_key': 'your_api_key', 'endpoint': 'https://api.example.com'}# 将配置数据写入YAML格式字符串
yaml_data = yaml.dump(config_data)# 将YAML格式字符串保存为配置文件
with open('dynamic_config.yaml', 'w') as file:file.write(yaml_data)

在这个例子中,通过代码动态生成了配置文件内容,并将其保存为YAML格式的配置文件。这种方式适用于需要根据程序运行时状态生成配置文件的场景。

性能优化与最佳实践

在处理大型YAML文件时,为了确保性能和最佳实践,以下是一些建议和策略:

1. 避免不必要的内存占用

import yaml# 使用生成器(Generator)方式逐行读取大型YAML文件
def read_large_yaml(file_path):with open(file_path, 'r') as file:for document in yaml.load_all(file, Loader=yaml.FullLoader):yield document# 逐行读取大型YAML文件并处理
for document in read_large_yaml('large_data.yaml'):# 在这里处理每个文档process_document(document)

通过使用生成器方式逐行读取大型YAML文件,可以避免一次性加载整个文件到内存中,减小内存占用。

2. 使用合适的Loader

PyYAML库提供了多个Loader,包括LoaderSafeLoaderFullLoader。在处理大型文件时,建议使用Loader=yaml.CLoader,它是LibYAML的C扩展版本,速度更快。

import yaml# 使用LibYAML的C扩展版本进行加载
data = yaml.load(yaml_data, Loader=yaml.CLoader)

3. 部分加载

如果YAML文件包含多个文档,只需要其中的一部分,可以使用yaml.load_all逐个加载文档,选择性地处理需要的部分。

import yaml# 逐个加载YAML文件的文档
with open('multi_document.yaml', 'r') as file:for document in yaml.load_all(file, Loader=yaml.FullLoader):if need_to_process(document):process_document(document)

注意事项与错误处理

在使用PyYAML时,有一些注意事项和常见错误需要注意:

1. YAML文件格式

确保YAML文件的格式正确,包括正确的缩进、使用冒号分隔键值对等。不规范的格式可能导致解析错误。

# 正确的YAML格式
key1: value1
key2:- item1- item2

2. 特殊字符转义

注意在YAML文件中使用特殊字符时需要进行适当的转义,以避免解析错误。

# 需要转义的特殊字符
special_string: "This is a string with a special character: \n"

3. 错误处理

在解析YAML文件时,使用tryexcept结构捕获yaml.YAMLError以处理可能的解析错误。

import yamltry:with open('data.yaml', 'r') as file:data = yaml.load(file, Loader=yaml.FullLoader)# 在这里处理成功解析的数据
except yaml.YAMLError as e:print(f"YAML parsing error: {e}")# 在这里处理解析错误

4. 安全性考虑

在处理不受信任的YAML数据时,考虑使用yaml.SafeLoader,以防止潜在的代码注入和安全问题。

import yamldata = yaml.load(yaml_data, Loader=yaml.SafeLoader)

总结

PyYAML是一个强大而灵活的YAML解析库,适用于多种场景,包括配置文件管理、数据传递与解析等。通过安装与基础用法的介绍,能够迅速上手并开始使用该库。深入了解高级功能与参数解析,包括自定义标签、Anchor与Alias、多文档处理等,有助于解决复杂数据结构的应用需求。实际应用场景展示了PyYAML在项目中的广泛应用,不论是在Web开发、自动化脚本还是数据科学领域,都能展现其强大功能。性能优化与最佳实践提供了处理大型YAML文件时的优化策略,确保代码的高效执行。同时,通过注意事项与错误处理的总结,可以更好地应对在使用PyYAML时可能遇到的问题,确保数据解析过程的顺利进行。

总体而言,掌握了PyYAML的基础与高级用法,结合实际案例的应用,将能够更加熟练地处理和解析YAML格式的数据,提高项目的灵活性和可维护性。在使用该库时,遵循最佳实践,注意安全性和错误处理,将有助于确保项目的稳定性和可靠性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

fe3d0c645e769109b26d563238836f71.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

力扣H指数——简约做法

Problem: 274. H 指数 文章目录 思路解题方法复杂度Code 思路 最后的结果一定不会超过下标个数。应为文章也要大于这个h,h超过了文章总数,就永远不会存在这么多的文章满足条件,所以只需要循环下标,那么最后的结果呢? 解…

AI质差小区优化效果评估

1. 下行流量/PRB利用率和贬损用户的关系 通过分析长期贬损质差小区:下行PRB利用率/流量和小区平均每小时质差用户数成正比例关系,即小区的贬损用户会随PRB利用率/流量的增长而增长。 2. 贬损用户和流量走势 年前平均每天流量平稳的情况下,通…

关于JS stack trace解决办法

问题描述 npm run serve启动前端项目时&#xff0c;控制台输出下图一堆的文字&#xff0c;JS stack trace , 问题现象&#xff1a; JS stack trace Security context: 0000017B93ACFB61 <JS Object>1: init_scope_vars [0000017B93A04381 <undefined>:~3382] [p…

LightPicture - 企业/团队图床系统安装搭建教程说明文档

LightPicture - 企业/团队图床系统安装搭建教程说明文档 使用thinkphpvue开发&#xff0c;前后端分离&#xff1b;根据安装教程安装即可使用&#xff1b; 程序功能 支持第三方云储存&#xff0c;本地、阿里云OSS、腾讯云COS、七牛云KODO、又拍云USS、华为云OBS等等 支持多…

60V/80V/90V降12V降5V 3A4A电流DCDC同步降压芯片

60V/80V/90V降12V降5V 3A4A电流DCDC同步降压芯片WD5105 一、概述 WD5105是一种高性能的DCDC同步降压芯片&#xff0c;适用于将60V/80V/90V的电压降至12V和5V&#xff0c;并可提供高达3A4A的电流。这款芯片具有高效率、低噪声、高稳定性等优点&#xff0c;适用于各种需要高电压…

如何在3dMax中实现创建对象时自动指定材质?

如何在3dMax中实现创建对象时自动指定材质&#xff1f; 我们在某些情况下是否希望为创建的对象指定默认材质呢&#xff1f;如果有这样的需求请不用担心&#xff0c;解决方案就在这里啦。它并不有多么复杂&#xff0c;但展示了如何使用NodeEventCallback在使用此回调系统的节点上…

北京数字孪生赋能工业制造,加速推进制造业数字化转型

随着新一代信息技术与实体经济深度融合进程的加快&#xff0c;企业数字化转型需求的提升&#xff0c;政策的持续支持&#xff0c;数字孪生将为工业制造、未来生活带来无限的可能。在制造业数字化大变革时代&#xff0c;以5G、大数据、物联网、人工智能等为代表的工业4.0&#x…

vue2-axios

下载axios 开发版本&#xff1a;axios.js 生产版本&#xff1a;axios.min.js 搭建服务器&#xff1a;json-server npm i -g json-serverjson-server --watch db.json&#xff08;启动服务并读取文件&#xff0c;db.json文件目录下启动&#xff09; json-server --watch db.j…

Redis-Redis高可用集群之水平扩展

Redis3.0以后的版本虽然有了集群功能&#xff0c;提供了比之前版本的哨兵模式更高的性能与可用性&#xff0c;但是集群的水平扩展却比较麻烦&#xff0c;今天就来带大家看看redis高可用集群如何做水平扩展&#xff0c;原始集群(见下图)由6个节点组成&#xff0c;6个节点分布在三…

基于DCT变换的图像压缩解压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DCT变换原理 4.2、基于DCT的图像压缩 4.3、基于DCT的图像解压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...................…

动态loading

项目中需要用到动图loading的地方可以下载 https://www.intogif.com/loading/ 高级点的还有css动画;692 Loaders: CSS & Tailwind 692 Loaders: CSS & Tailwind

【Python】np.unique() 介绍与使用

简述 numpy.unique&#xff1a;用于去除数组中重复元素&#xff0c;并从小到大排序&#xff08;找到唯一元素并排序&#xff09;。 def unique(ar, return_indexFalse, return_inverseFalse,return_countsFalse, axisNone):ar: 这是输入的数组或类数组对象。return_index: 如…

【数字信号处理】傅里叶变换的离散性与周期性

傅里叶变换的离散性与周期性 2023年11月21日 #elecEngeneer 文章目录 傅里叶变换的离散性与周期性1. 符号说明2. 具体分析3. 序列的序号表示的DFT下链 1. 符号说明 t : 连续时间(时域)变量 ω : 频域变量&#xff0c;aka角频率 g : 时域函数 G : 频域函数 n : 时域采样序列序号…

MAV3D:从文本描述中生成三维动态场景

Singer U, Sheynin S, Polyak A, et al. Text-to-4d dynamic scene generation[J]. arXiv preprint arXiv:2301.11280, 2023. MAV3D 是 Meta AI 研究者们提出的一种从文本描述生成三维动态场景的方法。从所提供的文本生成的动态视频输出可以从任何摄像机位置和角度查看&#xf…

Rust语言入门教程(一) - 简介及Cargo使用

Rust编程入门 为什么学习Rust 我本人是一个DevOps工程师&#xff0c;并不是专职的开发人员&#xff0c;但需要了解各种各样的语言的基本知识和特性&#xff0c;以便在不同的项目中帮助开发人员设计软件架构&#xff0c;部署流程以及进行错误排查和调试。但是对任何新生的优秀…

springboot 外部化配置

背景:修改jar包中的配置比较麻烦 项目部署的时候放一个配置文件在jar包外 配置文件优先级: 1.jar包内的application.properties/yaml 2.jar包内的application-{profile}.properties/yaml 3.jar包外的application.properties/yaml 4.jar包外的application-{profile}.properties…

【算法】缓存淘汰算法

目录 1.概述2.代码实现2.1.FIFO2.2.LRU2.3.LFU2.4.Clock2.5.Random 3.应用 1.概述 缓存淘汰策略是指在缓存容量有限的情况下&#xff0c;当缓存空间不足时决定哪些缓存项应当被移除的策略。缓存淘汰策略的目标是尽可能地保持缓存命中率高&#xff0c;同时合理地利用有限的缓存…

(保姆级教程)Mysql中事务的概念,什么是事务,如何使用事务,以及事务的隔离级别,什么是脏读、幻读,代码演示

继续讲解 Mysql 数据库中最重要的一个概念&#xff1a;事务 文章目录 事务1.1 什么是事务1.2 执行原理1.3 如何操作事务1.4 事务的特点&#xff08;ACID原则&#xff09;1.5 事务并发1.6 事务隔离级别1.6.1 事务并发问题操作演示1.6.2 脏读演示1.6.3 不可重复读演示1.6.4 幻读演…

二叉树的顺序结构及实现

目录 1 二叉树的顺序结构2. 堆的概念及结构3 .堆的实现(小堆) 1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;…

【Pytorch】Visualization of Feature Maps(3)

学习参考来自&#xff1a; Image Style Transform–关于图像风格迁移的介绍github&#xff1a;https://github.com/wmn7/ML_Practice/tree/master/2019_06_03 文章目录 风格迁移 风格迁移 风格迁移出处&#xff1a; 《A Neural Algorithm of Artistic Style》&#xff08;ar…