jjzjj

Py3笔记23:PyYAML

_百草_ 2023-03-28 原文

PyYAML模块是YAML解析器和生成器,即Python中使用YAML格式


0、YAML格式

数据序列化语言
通常用于配置文件,也用于数据存储或传输
支持基本数据类型:标量(如字符串、整数、浮点数)、列表、字典
推荐扩展名:.yaml
Python中2个用于YAML的模块:PyYAML、ruamel.yaml

YAML文件书写注意事项1-items.yaml

YAML文件书写注意事项1-items.yaml

  • 缩进不能使用tab,只能使用空格
  • 缩进表示层级关系
  • 大小写敏感
  • ...:表示一个文件的结束
  • ---:表示一个文件的开始,用于分割不同的文档
  • -空格:表示数组
  • !!:强制转换数据类型

1、安装

pip install pyyaml

2、使用详解

1)yaml文档读取

  • load()读取yaml;即将YAML文档转为Python对象
# 读取
import yaml  # 导入模块

with open("items.yaml") as f:
    content = yaml.load(f, Loader=yaml.FullLoader) # 加载内容
# YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. 
# Please read https://msg.pyyaml.org/load for full details.
print(content) # {'host': 'localhost', 'name': 'wlh', 'pwd': 12345, 'port': 3306}

标量值会转换为Python字典

  • load_all()读取多文档
with open("items.yaml", encoding="utf-8") as f:
    docs = yaml.load_all(f, Loader=yaml.FullLoader)  # <generator object load_all at 0x0000026A1DC9D430>
    for doc in docs:
        # doc={'host': 'localhost', 'name': 'wlh', 'pwd': 12345, 'port': 3306}
        # doc= {'cities': ['武汉', '上海', '北京', '深圳', '广州']}
        for k, v in doc.items():
            print(k, v)

2) yaml转储

  • dump()将Python对象序列化为YAML流
n = 1  # yaml中...表示注释
print(yaml.dump(n))
s = "string"  # str
print(yaml.dump(s))
l = [1, 2, 3]
print(yaml.dump(l))
t = (4, 5, 6)
print(yaml.dump(t))
d = {"name": "百草", "age": 18}
print(yaml.dump(d, allow_unicode=True))  # 避免中文乱码

输出结果:

1
...

string
...

- 1
- 2
- 3

!!python/tuple
- 4
- 5
- 6

age: 18
name: 百草

  • dump的sort_keys参数对键进行排序


    sort_keys参数
  • default_flow_style参数
    YAML文档在反序列化后再序列化,得到的YAML文档的格式与原来不一样?=>
    当前py3.7:default_flow_style默认False,即总是以块样式表示

    default_flow_style=False

3) yaml写入

with open("d.yaml", "w", encoding="utf-8") as f:
    yaml.dump(d, f, allow_unicode=True)
yaml写入结果

4)yaml记号
解析YAML文件时,使用较低级别的API。scan()扫描YAML流并生成扫描记号

with open("d.yaml", encoding="utf-8") as f:
    data = yaml.scan(f, Loader=yaml.FullLoader)  
    for item in data:
        print(item)

输出结果:

StreamStartToken(encoding=None)
BlockMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='name')
ValueToken()
ScalarToken(plain=True, style=None, value='百草')
KeyToken()
ScalarToken(plain=True, style=None, value='age')
ValueToken()
ScalarToken(plain=True, style=None, value='18')
KeyToken()
ScalarToken(plain=True, style=None, value='class')
ValueToken()
ScalarToken(plain=True, style=None, value='一年级')
BlockEndToken()
StreamEndToken()

5)

参考

  1. Python YAML教程
  2. Python的PyYAML模块详解
  3. YAML入门教程
  4. Python Yaml写入中文乱码的问题
  5. 【Python】yaml文件的读写

有关Py3笔记23:PyYAML的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  3. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  4. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  5. 华为数通笔记VXLAN&BGP EVPN - 2

    VXLAN简介定义RFC定义了VLAN扩展方案VXLAN(VirtualeXtensibleLocalAreaNetwork,虚拟扩展局域网)。VXLAN采用MACinUDP(UserDatagramProtocol)封装方式,是NVO3(NetworkVirtualizationoverLayer3)中的一种网络虚拟化技术。目的随着网络技术的发展,云计算凭借其在系统利用率高、人力/管理成本低、灵活性/可扩展性强等方面表现出的优势,已经成为目前企业IT建设的新趋势。而服务器虚拟化作为云计算的核心技术之一,得到了越来越多的应用。服务器虚拟化技术的广泛部署,极大地增加了数据中心的计算密度;同时,为

  6. 2022年10月23日周赛ZZULIOJ - 2

    文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐

  7. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  8. LinuxGUI自动化测试框架搭建(二十二)-框架主入口main.py设计&log日志调用 - 2

    (二十二)-框架主入口main.py设计&log日志调用和生成1测试目的2测试需求3需求分析4详细设计4.1新建存放日志目录log4.1.1配置config.py中写入log的目录4.2`baseInfo.py`中加入日志4.3`test_gedit.py`中加入日志4.4主函数入口main.py中调用日志5调用日志主函数main.py源码6`baseInfo.py`源码7`test_gedit.py`源码8运行效果9目前框架结构1测试目的组织运行所有的测试用例,并调用日志模块,便于问题定位。

  9. 【微服务笔记23】使用Spring Cloud微服务组件从0到1搭建一个微服务工程 - 2

    这篇文章,主要介绍如何使用SpringCloud微服务组件从0到1搭建一个微服务工程。目录一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件(2)微服务依赖1.2、搭建注册中心(1)引入依赖(2)配置文件(3)启动类1.3、搭建配置中心(1)引入依赖(2)配置文件(3)启动类1.4、搭建API网关(1)引入依赖(2)配置文件(3)启动类1.5、搭建服务提供者(1)引入依赖(2)配置文件(3)启动类1.6、搭建服务消费者(1)引入依赖(2)配置文件(3)启动类1.7、运行测试一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件这里主要是使用的SpringCloudNetflix

  10. ruby - 为什么 "23 Dogs"在 pry 中被解析为 2015 年 11 月 23 日,但 "3 Dogs"给出解析器错误? - 2

    我在Twitter上找到了以下代码片段(查看帖子历史以获取来源)。[5]pry(main)>Date.parse('3Dogs')ArgumentError:invaliddate[6]pry(main)>Date.parse('23Dogs')=>Mon,23Nov2015这只是一个偷偷摸摸的彩蛋吗?如果是这样,为什么这个特定的日期和结果?如果不是彩蛋,为什么23Dogs解析为日期,但3Dogs不解析? 最佳答案 这与Pry无关。如果您检查Date::parse的文档你会看到,“如果可选的第二个参数[comp]为真[默认值]并且检

随机推荐