yaml数据处理

2020-11-17  本文已影响0人  阿登20

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最基础、最常用的语法

二、yaml的安装

pip install pyyaml

三、yaml的数据结构

1.列表

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

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读文件

单个文件读取

  1. f = open(filename,"r")
  2. 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写入文件

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方法

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参数,否则中文写入后不会正常显示

上一篇下一篇

猜你喜欢

热点阅读