Python基础笔记1-Python读写yaml文件(使用PyYAML库)

简介: 最近在搭建自动化测试项目过程中经常遇到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文件进行读写操作,后续再记笔记进行介绍。

相关文章
|
21天前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
4天前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
9 2
|
20天前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
20天前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
Python
【Python初级】StringIO和BytesIO读写操作的小思考
from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法“无论如何”都读不出f的内容,使用readlines和循环也不行。
1501 0
|
10天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
3天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
12 5
|
3天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
8天前
|
数据处理 Python
从零到英雄:Python编程的奇幻旅程###
想象你正站在数字世界的门槛上,手中握着一把名为“Python”的魔法钥匙。别小看这把钥匙,它能开启无限可能的大门,引领你穿梭于现实与虚拟之间,创造属于自己的奇迹。本文将带你踏上一场从零基础到编程英雄的奇妙之旅,通过生动有趣的比喻和实际案例,让你领略Python编程的魅力,激发内心深处对技术的渴望与热爱。 ###
|
11天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!

热门文章

最新文章