揭秘YAML:Python中的PyYAML应用

🍀 前言

博客地址:

  • CSDN:https://blog.csdn.net/powerbiubiu

👋 简介

本章节介绍YAML文件格式的操作,通过Python的第三方库 PyYaml 来实现文件操作,在 Pyhon 代码中无论读取还是写入,都是使用列表字典的数据类型,这种类型在使用起来很方便。

📖 正文

1 安装PyYaml

pip install pyyaml -i [https://pypi.tuna.tsinghua.edu.cn/simple](https://pypi.tuna.tsinghua.edu.cn/simple)

2 使用PyYaml

2.1 方法介绍

从Yaml文件中获取数据:

  • yaml.load(stream, Loader=yaml.Loader):用于从 YAML 字符串或文件中加载单个文档,使用默认的 Loader,它具有一些可能存在安全风险的功能,不推荐在不受信任的输入中使用;
  • yaml.safe_load(stream):提供更安全的加载,防止潜在的代码注入攻击,使用 SafeLoader 代替 Loader,推荐在处理不受信任的输入时使用;
  • yaml.safe_load_all(stream):类似于 safe_load,但是可以用于加载多个文档,它返回一个迭代器,允许逐个迭代加载多个文档;

将数据下如Yaml文件中:

  • yaml.dump(data, stream=None, Dumper=yaml.Dumper):用于将数据转储为 YAML 格式,默认使用 Dumper,它具有一些可能存在安全风险的功能,不推荐在不受信任的环境中使用;
  • yaml.safe_dump(data, stream=None):提供更安全的转储,防止潜在的代码注入攻击,使用 SafeDumper 代替 Dumper,推荐在处理不受信任的数据时使用;
  • yaml.safe_dump_all(documents, stream=None):类似于 safe_dump,但是用于转储多个文档,接受一个迭代器或可迭代对象,用于逐个转储多个文档。
2.2 导入pyyaml
import pyyaml
2.3 load与dump

使用dump写入数据

data = {'name': 'John', 'age': 30, 'city': 'New York'}
with open('test.yaml', 'w', encoding='utf-8') as file:yaml.dump(data, file, allow_unicode=True)

test.yaml文件中的数据

age: 30
city: New York
name: John

使用load读取数据

with open('test.yaml', 'r', encoding='utf-8') as file:data = yaml.load(file, Loader=yaml.Loader)
print(data)# {'age': 30, 'city': 'New York', 'name': 'John'}

返回的数据为字典

2.4 safe_load与safe_dump

本小节的方法与2.3中的方法使用一样,唯一的区别在于2.3的方法存在风险,所以在不明确是否存在风险的情况,统一使用以下方法
使用safe_dump写入数据

data = {'name': 'John', 'age': 30, 'city': 'New York'}
with open('test.yaml', 'w', encoding='utf-8') as file:yaml.safe_dump(data, file, allow_unicode=True)

使用safe_load读取数据

with open('data.yaml', 'r', encoding='utf-8') as file:data = yaml.safe_load(file)# {'age': 30, 'city': 'New York', 'name': 'John'}
2.5 safe_load_all与safe_dump_all

读取多个文档
使用safe_dump_all写入数据

documents = [{'name': 'John', 'age': 30, 'city': 'New York'},{'name': 'Alice', 'age': 25, 'city': 'London'}
]
with open('multi_output.yaml', 'w', encoding='utf-8') as file:yaml.safe_dump_all(documents, file, allow_unicode=True)

test.yaml文件中的数据,可以发现,文件内容中通过---来对数据进行分割,实现多文档

age: 30
city: New York
name: John
---
age: 25
city: London
name: Alice

使用safe_load_all读取数据

with open('test.yaml', 'r', encoding='utf-8') as file:documents = yaml.safe_load_all(file)for doc in documents:print(doc)# {'age': 30, 'city': 'New York', 'name': 'John'}
# {'age': 25, 'city': 'London', 'name': 'Alice'}

改方式读取的数据,返回一个生成器<generator object load_all at 0x0000025516EA8C10>,可以通过list直接生成一个列表结果

with open('test.yaml', 'r', encoding='utf-8') as file:documents = yaml.safe_load_all(file)print(list(documents))# [{'age': 30, 'city': 'New York', 'name': 'John'}, {'age': 25, 'city': 'London', 'name': 'Alice'}]

3 工具类封装

import yaml
from typing import Union, List, Any, Dictclass YamlReader:def __init__(self, yaml_path: str, more: bool = False):"""初始化:param yaml_path: 文件:param more: yaml文件内容模式,是否为多文档,默认为False"""# 初始化判断yaml文件是否存在if os.path.exists(yaml_path):self.yaml_path = yaml_pathelse:with open(yaml_path, 'w', encoding='utf-8') as f:passself.__more = moredef read(self) -> Union[Dict[str, Any], List[Dict[str, Any]]]:"""读取数据:return:"""try:with open(self.yaml_path, 'r+', encoding='utf-8') as f:if self.__more:data = list(yaml.safe_load_all(f))else:data = yaml.safe_load(f)return dataexcept Exception as e:print("读取失败,请检查读取yaml文件内容模式是否正确")def write(self, item: List[Dict[str, Any]]) -> None:"""写入数据:param item: 写入数据:return:"""with open(self.yaml_path, 'w+', encoding='utf-8') as f:if self.__more:yaml.safe_dump_all(item, f, allow_unicode=True)else:yaml.safe_dump(item, f, allow_unicode=True)def append(self, item: List[Dict[str, Any]]) -> None:"""写入数据,追加写入:param item: 写入数据:return:"""with open(self.yaml_path, 'a+', encoding='utf-8') as f:if self.__more:yaml.safe_dump_all(item, f, allow_unicode=True)else:yaml.safe_dump(item, f, allow_unicode=True)
3.1 单个文档操作
if __name__ == '__main__':yr = YamlReader('test.yaml')data = [{'name': '张三', 'age': 18, 'gender': '男'}, {'name': '李四', 'age': 19, 'gender': '女'}]# 写入数据yr.write(data)# 读取数据print(yr.read())# [{'age': 18, 'gender': '男', 'name': '张三'}, {'age': 19, 'gender': '女', 'name': '李四'}]

test.yaml文件中内容为

- age: 18gender:name: 张三
- age: 19gender:name: 李四
3.2 多个文档操作
if __name__ == '__main__':yr = YamlReader('test.yaml', more=True)data = [{'name': '张三', 'age': 18, 'gender': '男'}, {'name': '李四', 'age': 19, 'gender': '女'}]# 写入数据yr.write(data)# 读取数据print(yr.read())# [{'age': 18, 'gender': '男', 'name': '张三'}, {'age': 19, 'gender': '女', 'name': '李四'}]

test.yaml文件中内容为

age: 18
gender:name: 张三
---
age: 19
gender:name: 李四

✏ 总结

通过 PyYaml 库操作 YAML 文件,可以灵活的实现数据的读取和写入,使用 PyYAML 实现 YAML 和 Python 对象的相互转换,但需要注意的是,YAML 文件对字母大小写敏感,同时需要注意缩进和空格。

💖 欢迎关注我的公众号

在这里插入图片描述

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

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

相关文章

【机器学习】逻辑回归:原理、应用与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 逻辑回归&#xff1a;原理、应用与实践引言1. 逻辑回归基础1.1 基本概念1.2 Sig…

视频汇聚EasyCVR安防系统对接公安部GA/T 1400视图库布控、告警、订阅流程描述

随着信息技术的飞速发展&#xff0c;视频监控在公共安全领域的应用越来越广泛&#xff0c;对于视频监控系统的要求也日益严格。为了满足公安系统对视频图像信息应用的高标准需求&#xff0c;视频汇聚平台EasyCVR视频监控系统全面支持GA/T 1400标准协议&#xff0c;为公安部门提…

基于JSP的母婴用品网站系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能界面 用户功能界面 前台首页功能界面 …

Java开发-面试题-0003-List、Set 和 Map的区别

Java开发-面试题-0003-List、Set 和 Map的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活公众…

BioPorto胰高血糖素样肽-1抗体(GLP-1)

丹麦BioPorto Diadnostics公司致力于提供世界领先的GLP-1抗体。基于结合GLP-1位点的不同&#xff0c;他们筛选出了不同的抗GLP-1抗体。有的抗体可以同时结合GLP-1的活性形式和非活性形式&#xff0c;有的专门结合生物活性形式的GLP-1。在开发和检测GLP-1相关治疗的过程中&#…

deepin 社区月报 | 2024年5月,deepin V23 RC 正式发布,校园联盟走进海外!

deepin&#xff08;深度&#xff09;社区5月总览 2024年5月&#xff0c;有1052位小伙伴加入了deepin&#xff08;深度&#xff09;社区大家庭&#xff0c;目前共有论坛伙伴154962位&#xff1b; 在5月&#xff0c;deepin V23 正式发布了RC版本&#xff0c;在本次发布的RC版本…

最新版点微同城源码34.7+全套插件+小程序前后端

带全套插件 自己耐心点配置一下插件 可以H5可以小程序 一款专属的同城服务平台对于企业和个人而言&#xff0c;无疑是拓展业务、提升服务品质的重要一环。点微同城源码搭配全套插件&#xff0c;以及完善的小程序前后端&#xff0c;将为您的业务发展提供强大支持 源码免费下载…

黑马程序员——Spring框架——day04——SpringMVC基础

目录&#xff1a; SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…

【JAVA |总结】JAVASE基础大总结(含思维导图)

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

c++实现机房预约管理系统

//computerRoom.h #pragma once #include <iostream> using namespace std;//机房类 class ComputerRoom { public:int m_ComId;//机房Id号int m_MaxNum;//最大容量}; //globalFile.h #pragma once//管理员文件 #define ADMIN_FILE "admin.txt" //学生文件 …

如何规划企业钓鱼邮件演练?

为什么要开展网络钓鱼演练 相信在甲方工作的信息安全工程师都知道&#xff0c;定期对公司员工进行安全意识培训是我们的工作内容之一&#xff0c;目的也很明确&#xff0c;通过安全意识培训来改变员工的不安全行为&#xff0c;降低人的风险。根据网络安全问题起源数据分析&…

内部协变量偏移问题(有无BN的代码比较)

1.什么是内部协变量偏移问题&#xff1a; 比如1000条数据&#xff0c;batch_size4&#xff0c;相当于要练250批次&#xff0c;当第一次批次的4条数据进行模型的训练时&#xff0c;此时网络学习动态已经养成&#xff0c;当第二批次进行训练时&#xff0c;极大可能导致差异较大&…

多模态融合目标检测新SOTA!推理速度提升2.7倍,实现最先进性能

为解决传统目标检测在复杂环境下效果不佳等问题&#xff0c;研究者们提出了多模态融合目标检测。 通过整合来自多个传感器的数据&#xff0c;充分利用不同传感器的优点&#xff0c;多模态融合目标检测能够更全面地捕捉目标信息&#xff0c;显著提高检测的准确性和鲁棒性&#…

弘君资本策略:短期博弈情绪边际降温 关注这四条线索

弘君资本指出&#xff0c;随着商场进入地产政策调查期&#xff0c;短期博弈情绪边沿降温&#xff0c;注重景气边沿改善和工业政策指向的结构性头绪。一是受供应侧节能降碳影响且可继续的提价链&#xff1b;二是获益于全球制造业向上的出口制造链&#xff1b;三是具有全球竞争力…

隐藏饼图的legend,重写legend列表。

因为要实现的饼图效果较复杂,所以,需要重新写列表。 点击右侧列表的圆点,实现隐藏左侧饼图相应环状。 // 饼图,点击自定义列表,显示和隐藏饼图对应的环状数据<template> <div class="index_div"> <a-spin :spinning="aLoading">&l…

Unity开发——编辑器打包、3种方式加载AssetBundle资源

一、创建ab资源 &#xff08;一&#xff09;Unity资源设置ab格式 1、选中要打包成assetbundle的资源&#xff1b; 可以是图片&#xff0c;材质球&#xff0c;预制体等&#xff0c;这里方便展示用预制体打包设置展示&#xff1b; 2、AssetBundle面板说明 &#xff08;1&…

【YOLOv5进阶】——模型结构与模型原理YOLOv5源码解析

一、基础知识 1、backbone backbone是核心组成部分&#xff0c;主要负责提取图像特征。具体来说&#xff0c;backbone通过一系列的卷积层和池化层对输入图像进行处理&#xff0c;逐渐降低特征图的尺寸同时增加通道数&#xff0c;从而保留和提取图像中重要的特征。这些提取出的…

Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用

说明 一些游戏开发者在做单机游戏功能时&#xff08;例如&#xff1a;每日奖励、签到等&#xff09;&#xff0c;可能会需要获得服务端标准时间&#xff0c;用于游戏功能的逻辑处理。 问题分析 1、自己如果有服务器&#xff1a;自定义一个后端API&#xff0c;客户端按需请求…

使用Obfuscar 混淆WPF(Net6)程序

Obfuscar 是.Net 程序集的基本混淆器&#xff0c;它使用大量的重载将.Net程序集中的元数据&#xff08;方法&#xff0c;属性、事件、字段、类型和命名空间的名称&#xff09;重命名为最小集。详细使用方式参见&#xff1a;Obfuscar 在NetFramework框架进行的WPF程序的混淆比较…

Spring @Transactional 事务注解

一、spring 事务注解 1、实现层(方法上加) import org.springframework.transaction.annotation.Transactional;Transactional(rollbackFor Exception.class)public JsonResult getRtransactional() {// 手动标记事务回滚TransactionAspectSupport.currentTransactionStatus…