最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记。

一,YAML 简介

YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。

二,YAML 语法

  • 支持的数据类型:

    字典、列表、字符串、布尔值、整数、浮点数、Null、时间等

  • 基本语法规则:

    1、大小写敏感

    2、使用缩进表示层级关系

    3、相同层级的元素左侧对齐

    4、键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔

    5、数组前加有 “-” 符号,符号与值之间需用空格分隔

    6、None值可用null 和 ~ 表示

    7、多组数据之间使用3横杠---分割

    8、# 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错

    注意:网上查找到各种博客都提到yaml缩进时不能使用tab键,但我在pycharm编辑器里实际使用时是可以使用tab键进行缩进的,读写时并没有报错!

三,安装第三方yaml文件处理库PyYAML

python没有自带的处理yaml文件的库,需要下载第三方库PyYAML 或 ruamel.yaml ,这里我们安装PyYAML。

pip install pyyaml
# 下载速度慢的话加上清华镜像源
pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

四,读取yaml文件

1,从yaml中读取字典

yaml中的字典格式如下:

# yaml文件,文件名为yamlData

os: Android
osVersion: 10
account:
username: xiaoqq
password: 123456
deviceName: null
appPackage: ~
bool1: True

读取字典代码:

# @author: 给你一页白纸

import yaml

with open('./yamlData.yml', 'r', encoding='utf-8') as f:
result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))
print(result['os'], type(result['os']))
print(result['osVersion'], type(result['osVersion']))
print(result['account'], type(result['account']))
print(result['account']['username'])
print(result['deviceName'])
print(result['appPackage'])
print(result['bool1'], type(result['bool1']))

读取结果:

{'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None} <class 'dict'>
Android <class 'str'>
10 <class 'int'>
{'username': 'xiaoqq', 'password': 123456} <class 'dict'>
xiaoqq
None
None
True <class 'bool'>

从读取结果可以看出:

1,读取出来的数据不会改变原数据类型,即yaml里是什么数据类型,读出来就是什么类型。

2,Loader=yaml.FullLoader参数不写的话对结果不会有影响,但运行时会出现警告信息。

3,yaml.load(f.read(), Loader=yaml.FullLoader)也可以写成yaml.load(f, Loader=yaml.FullLoader),读取出来的结果相同。

2,从yaml中读取list

yaml中list格式:数据前加'-' 并使用空格与数据间隔开,如下:

# yaml文件名yamlData

- Android
- 10
- null
- ~
- True

读取list代码:

# @author: 给你一页白纸

import yaml

with open('./yamlData.yml', 'r', encoding='utf-8') as f:
result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))

读取结果:

['Android', 10, None, None, True] <class 'list'>

3,从yaml中读取元组

yaml中存储元组格式:yaml中使用!!对数据类型进行转换,yaml中tuple由list转换而来。如下:

# yaml文件名yamlData

!!python/tuple
- Android
- 10
- null
- ~
- True

读取元组代码:

# @author: 给你一页白纸

import yaml

with open('./yamlData.yml', 'r', encoding='utf-8') as f:
result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))

读取结果:

('Android', 10, None, None, True) <class 'tuple'>

在实际使用中,很多的时候往往是多种类型嵌套的数据。如下yaml数据

# yaml文件名yamlData

os: Android
osVersion: 10
account:
- username1: xiaoqq
- password1: 123456
- username2: Lilei
- password2: 888888
deviceName: null
appPackage: ~
bool1: True

读取结果:

{'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}

4,从yaml中读取多组数据

yaml多组数据时,每组数据之间需要用3横杠分隔'---',如下:

os: Android
osVersion: 10
account1:
username1: xiaoqq
password1: 123456
---
os: ios
osVersion: 12
account1:
username2: Lilei
password2: 888888

从yaml中读取多组数据时需要使用yaml.load_all()方法,返回结果为一个生成器,需要使用for循环语句获取每组数据。代码如下:

# @author: 给你一页白纸

import yaml

with open('./yamlData.yml', 'r', encoding='utf-8') as f:
result = yaml.load_all(f.read(), Loader=yaml.FullLoader)
print(result, type(result))
for i in result:
print(i)

读取结果:

<generator object load_all at 0x000001F78EBD5B48> <class 'generator'>
{'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}}
{'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}}

五,写入yaml文件

1,单组数据写入yaml文件

使用yaml.dump()方法,加入allow_unicode=True参数防止写入的中文乱码,如下:

# @author: 给你一页白纸

import yaml

apiData = {
"page": 1,
"msg": "地址",
"data": [{
"id": 1,
"name": "学校"
}, {
"id": 2,
"name": "公寓"
}, {
"id": 3,
"name": "流动人口社区"
}],
} with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
yaml.dump(data=apiData, stream=f, allow_unicode=True)

写入结果:

data:
- id: 1
name: 学校
- id: 2
name: 公寓
- id: 3
name: 流动人口社区
msg: 地址
page: 1

2,多组数据写入yaml文件

使用yaml.dump_all()方法,如下:

# @author: 给你一页白纸

import yaml

apiData1 = {
"page": 1,
"msg": "地址",
"data": [{
"id": 1,
"name": "学校"
}, {
"id": 2,
"name": "公寓"
}, {
"id": 3,
"name": "流动人口社区"
}],
} apiData2 = {
"page": 2,
"msg": "地址",
"data": [{
"id": 1,
"name": "酒店"
}, {
"id": 2,
"name": "医院"
}, {
"id": 3,
"name": "养老院"
}],
} with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)

写入结果:

data:
- id: 1
name: 学校
- id: 2
name: 公寓
- id: 3
name: 流动人口社区
msg: 地址
page: 1
---
data:
- id: 1
name: 酒店
- id: 2
name: 医院
- id: 3
name: 养老院
msg: 地址
page: 2

在Python中除了PyYAML库之外,还有ruamel.yaml库也可以对yaml文件进行读写操作,后续再记笔记进行介绍。

Python基础笔记1-Python读写yaml文件(使用PyYAML库)的更多相关文章

  1. python操作YAML文件之pyyaml库

    1. YAML简介 YAML是一种被认为可以超越XML.JSON的配置文件,最早接触是Spring Boot,木有想到python也是支持的,遂研究一下. python解析YAML库叫做pyyaml, ...

  2. Python基础笔记系列十一:标准输入输出、文件读写和指针等操作

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...

  3. Python基础篇(五)_文件和数据格式化

    Python基础篇_文件和数据格式化 文件的使用:文件打开.关闭.读写 文件打开:通过open()函数打开文件,并返回一个操作文件的变量. 使用语法:<变量名> = (<文件路径以及 ...

  4. Python基础笔记系列一:基本工具与表达式

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...

  5. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  6. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  7. python基础系列教程——Python库的安装与卸载

    python基础系列教程——Python库的安装与卸载 2.1 Python库的安装 window下python2.python3安装包的方法 2.1.1在线安装 安装好python.设置好环境变量后 ...

  8. Python基础笔记2-ruamel.yaml读写yaml文件

    上一篇笔记记录了Python中的pyyaml库对yaml文件进行读写,但了解到ruamel.yaml也能对yaml文件进行读写,于是想尝试一下它的用法. 一,注意 这里首先要更正一下网上大部分博客的说 ...

  9. 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)

    目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...

随机推荐

  1. akka-streams - 从应用角度学习:basic stream parts

    实际上很早就写了一系列关于akka-streams的博客.但那个时候纯粹是为了了解akka而去学习的,主要是从了解akka-streams的原理为出发点.因为akka-streams是akka系列工具 ...

  2. 高可用服务之Keepalived基础入门

    前面我们聊了聊高可用集群corosync+pacemaker的相关概念以及相关工具的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/category/18 ...

  3. [业界方案]用Jaeger来学习分布式追踪系统Opentracing

    [业界方案]用Jaeger来学习分布式追踪系统Opentracing 目录 [业界方案]用Jaeger来学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 & 问题 1. ...

  4. [算法]类似n sum个数的问题(DP)

    题目 求和为target的数组元素组合数,含重复. 例: 输入 arr = { 1, 2, 3, 3, 4 } ,target = 6 输出 4 题解 dp[i][j]代表到数组第i-1个元素,目标和 ...

  5. C语言汇总3

    16-18 1.常量 整型常量:1: 2: 3: 实型常量(小数):单精度常量[3.14],双精度常量(默认情况下)[10.1f] 字符型常量 ' 5 ',只要在双引号的任意的唯一一个字符就为字符型常 ...

  6. 基于k8s的集群稳定架构

    前言 我司的集群时刻处于崩溃的边缘,通过近三个月的掌握,发现我司的集群不稳定的原因有以下几点: 1.发版流程不稳定 2.缺少监控平台[最重要的原因] 3.缺少日志系统 4.极度缺少有关操作文档 5.请 ...

  7. Centos 7 redis、tomcat、Spring Boot添加开机自启服务

    一.redis添加开机自启 1.添加服务配置文件 [root@test system]# vim /etc/systemd/system/redis-server.service 2.服务配置文件内容 ...

  8. Zookeeper集群"脑裂"问题 - 运维总结

    关于集群中的"脑裂"问题,之前已经在这里详细介绍过,下面重点说下Zookeeper脑裂问题的处理办法.ooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调 ...

  9. volatile关键字解释和使用

    一.java内存模型的相关概念:原子性.可见性与有序性 原子性: 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原 ...

  10. 并发编程(六)Object类中线程相关的方法详解

    一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...