yaml数据处理
yaml的使用
yaml读取数据结构总局:
**1.存储字典时,以[key:value]的形式定义**
**2.存储列表时,需要使用[- 元素]表示列表**
**3.存储多组数据时,需要每组数据之间使用3个横杠- 分割分割**
**4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少**
**5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning**
yaml写入文件总结:
1.写入一组数据直接使用dump方法或者dump_all方法也可
2.写入多组数据只能使用dump_all方法
3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示
image.png
image.png
image.png
一 、yaml的基础规则
首先了解一下yaml最基础、最常用的语法
- 大小写敏感
- 使用缩进代表层级关系
- 缩进只能用空格,不能使用Tab
- 不要求空格个数,只要相同层级左对齐
- 冒号后面需要输入一个空格,再输入值
二、yaml的安装
pip install pyyaml
三、yaml的数据结构
1.列表
-
-
后面跟空格 value -
-
处于同一列表示同级关系 -
-
不跟任何东西,下面缩进跟上-
value 可以嵌套
list嵌套必须满足。如下样式
-
- 1
- 2
image.png
- name
- age
- sex
-
- 1
- 2
- 3
-
- 4
- 5
-
- 6
输出:['name', 'age', 'sex', [1, 2, 3], [4, 5, [6]]]
- 列表嵌套字典
-
name: 阿登
age: 18
-
name: 向佳
age: 20
-
- 1
- 2
- 3
输出:
[{'name': '阿登', 'age': 18}, {'name': '向佳', 'age': 20}, [1, 2, 3]]
2.字典
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map[字典]
name: 阿登
age: 18
sex: 男
hobby: 女
结果:{'name': '阿登', 'age': 18, 'sex': '男', 'hobby': '女'}
-
字典嵌套字典
dict1: name: 阿登 age: 18 dict2: name: 向佳 age: 20
结果:{'dict1': {'name': '阿登', 'age': 18}, 'dict2': {'name': '向佳', 'age': 20}}
- 字典嵌套列表
dict1:
- name
- age
dict2:
- adeng
- 18
结果:{'dict1': ['name', 'age'], 'dict2': ['adeng', 18]}
yaml数据结构要注意层级缩进。同一列的表示在一个层级。如果要嵌套需要换行
3. 纯量
yaml中提供了多种纯量,包括整数、浮点数、字符串、null、日期、布尔值、时间
n7: !!str true # boolean转str
boolean:
- TRUE # true, True都可以
- FALSE # false, False都可以
float:
- 3.14
- 6.8523015e+5 # 可以使用科学计算法
int:
- 123
- 0b1010_0111_0100_1010_1110 # 二进制表示
null:
nodeName: 'node'
parent: ~ # 使用~表示null
string:
- 哦豁
- 'hello world' # 可以使用双引号或者单引号包裹特殊字符
- newline
newline2 # 字符串可以折成多行,每一行会被转化成空格
date:
- 2020-10-14 # 日期必须使用ISO 8601格式,即YYYY-mm-dd
datetime:
- 2020-11-14T08:56:30+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+号代表
{ 'aaa': 'true', 'boolean': [True, False], 'date': [datetime.date(2020, 10, 14)], 'datetime': [datetime.datetime(2020, 11, 14, 8, 56, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))], 'float': [3.14, 685230.15], 'int': [123, 685230], 'string': ['哦豁', 'hello world', 'newline newline2']
}
四、yaml读文件
单个文件读取
- f = open(filename,"r")
- yaml.load(f,Loader=yaml.FullLoader)
Loader=yaml.FullLoader
解决警告问题
import yaml
from pprint import pprint
with open(r"yaml_data.yaml") as f:
data = yaml.load(f, Loader=yaml.FullLoader)
pprint(data)
yaml读取多组数据
loade_all方法读取多组数据,返回的是一个生成器。可以for循环得到每一组数据
aaa: !!str true # boolean转str
boolean:
- TRUE # true, True都可以
- FALSE # false, False都可以
---
float:
- 3.14
- 6.8523015e+5 # 可以使用科学计算法
import yaml
from pprint import pprint
with open(r"yaml_data.yaml") as f:
data = yaml.load_all(f, Loader=yaml.FullLoader)
pprint(data)
for i in data:
pprint(i)
<generator object load_all at 0x00000000128FF890> 生成器
{'aaa': 'true', 'boolean': [True, False]}
{'float': [3.14, 685230.15]}
通过输出结果及yaml存储内容可以看出,当yaml文件存储多组数据在一个yaml文件中时,需要使用3个横杆分割,读取数据时需要使用load_all方法,而且此方法返回一个生成器
yaml读取数据结构:
1.存储字典时,以[key:value]的形式定义
2.存储列表时,需要使用[- 元素]表示列表
3.存储多组数据时,需要每组数据之间使用3个横杠- 分割分割
4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少
5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning
五、yaml写入文件
-
dump方法 写入到文件。
-
第一个参数是 构造的数据
-
第2个参数是文件对象 f
-
allow_unicode=True 写入中文时,不乱码
-
indent 可以设置缩进空格 格式
-
import yaml
from pprint import pprint
datas = {
"status": 1,
"code": "1001",
"data": [
{
"id": 80,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
},
{
"id": 81,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
}
],
"msg": "获取用户列表成功"
}
with open("yaml_data1.yaml",mode="w",encoding="utf-8") as f1:
yaml.dump(datas,f1, allow_unicode=True,indent=2)
写入的样式:
code: '1001'
data:
- id: 80
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
- id: 81
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
msg: 获取用户列表成功
status: 1
写入多个
dump_all方法
- documents 多个数组写入传入一个元组
- stream 传入 文件对象
- allow_unicode=True 写入文件防止中文乱码。
- indent=2 缩进间隔
import yaml
from pprint import pprint
datas = {
"status": 1,
"code": "1001",
"data": [
{
"id": 80,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
},
{
"id": 81,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
}
],
"msg": "获取用户列表成功"
}
info = {
"name": "阿登",
"age": 18
}
with open("yaml_data1.yaml",mode="w",encoding="utf-8") as f1:
yaml.dump_all(documents=(datas, info),stream=f1,allow_unicode=True,indent=2)
结果:
code: '1001'
data:
- id: 80
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
- id: 81
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
msg: 获取用户列表成功
status: 1
--- 写入多组数据三个扛 -
age: 18
name: 阿登
yaml写入文件总结:
1.写入一组数据直接使用dump方法或者dump_all方法也可
2.写入多组数据只能使用dump_all方法
3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示