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 pypi.tuna.tsinghua.edu/simple
四,读取yaml⽂件
yaml中的字典格式如下:
# yaml⽂件,⽂件名为yamlData
os: Android
osVersion: 10
account:
username: xiaoqq
python怎么读取py文件
password: 123456
deviceName: null
appPackage: ~
bool1: True
读取字典代码:
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.ad(), Loader=yaml.FullLoader)也可以写成yaml.load(f, Loader=yaml.FullLoader),读取出来的结果相同。
yaml中list格式:数据前加'-' 并使⽤空格与数据间隔开,如下:
# yaml⽂件名yamlData
- Android
- 10
- null
- ~
- True
读取list代码:
# @author: 给你⼀页⽩纸
import yaml
with open('./l', 'r', encoding='utf-8') as f:
result = yaml.ad(), Loader=yaml.FullLoader)
print(result, type(result))
读取结果:
['Android', 10, None, None, True] <class 'list'>
yaml中存储元组格式:yaml中使⽤!!对数据类型进⾏转换,yaml中tuple由list转换⽽来。如下:
# yaml⽂件名yamlData
!!python/tuple
- Android
-
10
- null
- ~
- True
读取元组代码:
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': T 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('./l', 'r', encoding='utf-8') as f:
result = yaml.load_ad(), 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⽂件
使⽤yaml.dump()⽅法,加⼊allow_unicode=True参数防⽌写⼊的中⽂乱码,如下:
apiData = {
"page": 1,
"msg": "地址",
"data": [{
"id": 1,
"name": "学校"
}, {
"id": 2,
"name": "公寓"
}, {
"id": 3,
"name": "流动⼈⼝社区"
}],
}
with open('./l', '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
使⽤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('./l', '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⽂件进⾏读写操作,后续再记笔记进⾏介绍。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。