前言
配置文件除了常见的.ini、.conf之外,yaml也是一种配置文件类型,相比与.ini、.conf,yaml配置文件更简洁、操作更简单、同时也可以存放不同数据类型,读取时会原样读取出文件中的数据类型。yaml文件依赖与python的第三方库PyYaml模块。
PyYaml安装
在cmd中输入命令pip install pyyaml
或你直接在pychar-setting中安装,如下图
yaml存数据方式
1.存放字典数据
config.yaml
read.yaml
输出
从输出结果及yaml读取文件内容可以看到,输出的内容是一个字典类型,yaml文件中存储的字符串输出仍是字符串类型,int型仍是int型等,存储None类型可以使用null,~符号以及None,这也是区别ini配置文件的地方,且文件内容使用[key:value]的形式定义,当然key和value也可以使用双引号修饰;
2.yaml存储多组数据
read.yaml
输出
如果需要读取多组数据时,需要使用load_all方法,返回的是一个生成器,需要使用for循环来分别读取出数据。在文件写入时,多组数据需要使用三个-分隔符隔开。
3.yaml存储列表并读取
read.yaml
输出
yaml存储数据为列表时,在写入文件时需要在前面加上一个-分隔符。
4.yaml存储元组类型
read.yaml
输出
yaml写入文件时可以使用!!强制转化数据类型
conf.yaml
key:
- word:
username: xrr
password: 123456
key1:
first: python
second: pyyaml
read.yaml
import yaml
with open("conf.yaml", "r", encoding="utf8") as f:
context = yaml.load(f, Loader=yaml.FullLoader)
print("读取内容\n", context, type(context))
输出
读取内容
{'key': [{'word': {'username': 'xrr', 'password': 123456}}], 'key1': {'first': 'python', 'second': 'pyyaml'}} <class 'dict'>
小结:
实际工作中用于存储字典,列表,或者相互嵌套的数据较常见,那么在存储和读取时需要掌握以下几点
1.存储字典时,以[key:value]的形式定义
2.存储列表时,需要使用[- 元素]表示列表
3.存储多组数据时,需要每组数据之间使用3个横杠-分割分割
4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少
5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning
写yaml文件
写入yaml文件比较简单直接使用dump和dump_all方法即可
dump写入一组数据
import yaml
response_data = {
"code": "200",
"data": [
{
"id": 1517,
"regname": "jack",
"pwd": "123456",
"mobile_phone": "13168717209",
"type": "1",
},
{
"id": 1518,
"regname": "jackl",
"pwd": "Q112345",
"mobilephone": "13168717209",
"type": "1",
}
],
"msg": "获取用户列表成功"
}
try:
with open("./config.yaml", "w", encoding="utf-8") as f:
yaml.dump(data=response_data, stream=f, allow_unicode=True)
except Exception as e:
print("写入yaml文件内容失败")
raise e
else:
print("写入yaml文件内容成功")
写入结果:
code: '200'
data:
- id: 1517
mobile_phone: '13168717209'
pwd: '123456'
regname: jack
type: '1'
- id: 1518
mobilephone: '13168717209'
pwd: Q112345
regname: jackl
type: '1'
msg: 获取用户列表成功
dump_all写入多组数据
import yaml
response_data = {
"code": "200",
"data": [
{
"id": 1517,
"regname": "jack",
"pwd": "123456",
"mobile_phone": "13168717209",
"type": "1",
},
{
"id": 1518,
"regname": "jackl",
"pwd": "Q112345",
"mobilephone": "13168717209",
"type": "1",
}
],
"msg": "获取用户列表成功"
}
data1 = {
"code": "200",
"data": [
{
"id": 1519,
"regname": "jack2",
"pwd": "123456",
"mobile_phone": "13168717202",
"type": "1",
}]
}
try:
with open("./config.yaml", "w", encoding="utf-8") as f:
yaml.dump_all(documents = [response_data,data1],stream=f,allow_unicode=True)
except Exception as e:
print("写入yaml文件内容失败")
raise e
else:
print("写入yaml文件内容成功")
写入结果:
code: '200'
data:
- id: 1517
mobile_phone: '13168717209'
pwd: '123456'
regname: jack
type: '1'
- id: 1518
mobilephone: '13168717209'
pwd: Q112345
regname: jackl
type: '1'
msg: 获取用户列表成功
---
code: '200'
data:
- id: 1519
mobile_phone: '13168717202'
pwd: '123456'
regname: jack2
type: '1'
小结:
1.写入一组数据直接使用dump方法或者dump_all方法也可
2.写入多组数据只能使用dump_all方法
3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示