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]]}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-07-09 python测试开发——测试工具开发GUI编程
2022-07-09 python测试开发——WEB前端技术(html,css,js)