Yaml技术

1:Yaml基本语法    pip install pyyaml  【python操作yaml文件库】

1:基本规则
  大小写敏感
  使用缩进表示层级关系
  缩进时不允许使用Tab,只允许使用空格
  缩进的空格数目不重要,只要相同层级的元素左对齐即可
  # 表示注释,从它开始到行尾都被忽略
2:yaml转字典
# 下面格式读到Python里会是个dict
name: 灰蓝
age: 0
job: Tester

输出:
{'job': 'Tester','age': 0,'name':u'\u7070\u84dd'}
3:yaml转列表
yaml中支持列表或数组的表示,如下:
# 下面格式读到Python里会是个list
- 灰蓝
- 0
- Tester
输出:[u'\u7070\u84dd', 0,'Tester']
4:复合结构
字典和列表可以复合起来使用,如下:
# 下面格式读到Python里是个list里包含dict
- name: 灰蓝
  age: 0
  job: Tester
- name: James
  age: 30

输出:
[{'job': 'Tester','age': 0,'name':u'\u7070\u84dd'}, {'age': 30,'name':'James'}]

2:YAML基本类型

yaml中有以下基本类型:
  字符串
  整型
  浮点型
  布尔型
  null
  时间
  日期
1:# 这个例子输出一个字典,其中value包括所有基本类型
str: "Hello World!"
int: 110
float: 3.141
boolean: true # or false
None: null # 也可以用 ~ 号来表示 null
time: 2016-09-22t11:43:30.20+08:00 # ISO8601,写法百度
date: 2016-09-22 # 同样ISO8601

输出:
{'date': datetime.date(2016, 9, 22),
'None': None,
'boolean': True,
'str':'Hello World!',
'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000),
'int': 110,
'float': 3.141}
2:如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了
str: 灰蓝
str1: "Hello World"
str2: "Hello\nWorld"

输出:
{'str2': 'Hello\nWorld','str1': 'Hello World', 'str': u'\u7070\u84dd'}
3:要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,
  双引号不会被Python转义,到最后是输出了特殊字符;可能比较拗口,来个例子理解下: str1:
'Hello\nWorld' str2: "Hello\nWorld" python代码: # -*- coding: utf-8 -*- import yaml y = yaml.load(file('test.yaml', 'r')) print y['str1'] print y['str2'] 输出: Hello\nWorld Hello World 可以看到
单引号中的
'\n'最后是输出了
双引号中的'\n'最后是转义成了回车 字符串处理中写成多行、'|''>''+''-'的意义这里就不讲了。

3:引用  & 和 * 用于引用

name: &name 灰蓝
tester: *name

这个相当于以下脚本:
name: 灰蓝
tester: 灰蓝

输出:
{'name': u'\u7070\u84dd','tester':u'\u7070\u84dd'}

7:强制转换

yaml是可以进行强制转换的,用 !! 实现,如下:
str: !!str 3.14
int: !!int "123"
输出:
{'int': 123,'str': '3.14'}
明显能够看出 123 被强转成了 int 类型,而 float 型的 3.14 则被强转成了str型。
另外PyYaml还支持转换成Python
/object类型,这个我们下面再讨论

8:分段  ---

在同一个yaml文件中,可以用 --- 来分段,这样可以将多个文档写在一个文件中
---
name: James
age: 20
---
name: Lily
age: 19

这时候我们就得用到我们的 load_all() 方法出场了,load_all() 方法会生成一个迭代器,可以用for输出出来:

# -*- coding: utf-8 -*-
import yaml
ys = yaml.load_all(file('test.yaml','r'))
for y in ys:
    print y

输出:
{'age': 20,'name': 'James'}
{'age': 19,'name': 'Lily'}
对应的也有 dump_all() 方法,一个意思,就是将多个段输出到一个文件中,举个例子:
# -*- coding: utf-8 -*-
import yaml
obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19]
with open('test.yaml','w') as f:
    yaml.dump_all([obj1, obj2], f)

打开test.yaml看看:
{age: 20, name: James}
--- [Lily, 19]
dump() 和 dump_all() 方法可以传入列表,也可以传入一个可序列化生成器,如 range(10), 如下:
# -*- coding: utf-8 -*-
import yaml
fo = open('../config/test.yaml','w',encoding='utf-8')
yaml.dump(range(10),fo)

这是写入了一个python里的range数据对象类型 输出:[0,
1, 2, 3, 4, 5, 6, 7, 8, 9] 在 dump 和 dump_all() 的时候还可以配一堆参数

上面的信息读取:只能使用 unsafe_load
import yaml

y = yaml.unsafe_load(open('./test.yaml', 'r', encoding='utf-8'))
for i in y:
  print(i)
正常读取一个yaml文件的内容:使用safe_load或者load
import yaml
y = yaml.safe_load(open('./test.yaml', 'r', encoding='utf-8'))
for i in y:
    print(i)
import yaml
fileobject = open('./test.yaml', 'r', encoding='utf-8')
y = yaml.load(fileobject.read(), Loader=yaml.FullLoader)
for i in y:
    print(i)

 9:Yaml操作

1、yaml使用场景
    配置文件
    测试用例
2、yaml语法
  字典
  列表
  嵌套
  注释
  & * 变量操作
  多用例
  空格与颜色变化
- #test4
  url: /api/mgr/loginReq
  method: post
  detail: 不传账号,不传密码
  data:
    username: "" #如果不填 None
    password: ""
  check:
    retcode: 1
    reason: 用户或者密码错误

10:yaml里引用yaml文件

PyYAML允许您附加自定义构造函数(如!include)到YAML加载程序
基于类的解决方案:
这里有一个基于类的解决方案,它避免了我最初响应的 全局根变量
使用元类注册自定义构造函数:
import yaml
import os.path
class Loader(yaml.Loader):#继承
  def __init__(self, stream):
    self._root = os.path.split(stream.name)[0]
    super(Loader, self).__init__(stream)
  def include(self, node):
    filename = os.path.join(self._root, self.construct_scalar(node))
    with open(filename,'r') as f:
      return yaml.load(f, Loader)
Loader.add_constructor('!include', Loader.include)
例如:
a.yaml
a: 1
b:
  - 2
  - 3
c: !include b.yaml

b.yaml
- 10
- [100, 200, 300]
可以使用以下方法加载文件:
with open('a.yaml','r') as f:
  data = yaml.load(f, Loader)
  print(data)
打印内容如下: {
'a': 1, 'b': [2, 3], 'c': [10, [100,200, 300]]}

 

 

 

 

posted @ 2023-07-09 16:16  至高无上10086  阅读(18)  评论(0编辑  收藏  举报