前言

yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时都会原样输出,yaml文件依赖python的第三方库PyYaml模块

转载自:https://www.cnblogs.com/linuxchao/p/linuxchao-yaml.html

PyYaml安装

打开CMD执行命令: pip install PyYaml

读yaml文件

1、存字典类型

config.yaml

  1. cnblog: 标题
  2. address: BeiJing
  3. Company: china
  4. age: 18
  5. now: 8.14
  6. empty1: null
  7. empty2: ~

parseyaml.py

  1. import yaml
  2.  
  3. # 定义yaml文件路径
  4. yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml'
  5.  
  6. with open(yaml_path,"r",encoding="utf8") as f:
  7. context=yaml.load(f,Loader=yaml.FullLoader)
  8. print("读取内容", context, type(context))
  9. print(context["cnblog"], type(context["cnblog"]))
  10. print(context["age"], type(context["age"]))
  11. print(context["now"], type(context["now"]))
  12. print(context["empty1"], type(context["empty1"]))

输出

  1. 读取内容 {'cnblog': '标题', 'address': 'BeiJing', 'Company': 'china', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'>
  2. 标题 <class 'str'>
  3. 18 <class 'int'>
  4. 8.14 <class 'float'>
  5. None <class 'NoneType'>
  6. None <class 'NoneType'>

结论

当前输出的内容是一个字典类型,

yaml文件中存储的字符串输出仍是字符串类型,int型仍是int型等,

存储None类型可以使用null,~符号以及None,

这也是区别ini配置文件的地方,

且文件内容使用[key:value]的形式定义,当然key和value也可以使用双引号修饰;

2.yaml存多组数据并读取

config.yaml

  1. cnblog: linux
  2. address: BeiJing
  3. Company: petrochina
  4. age: 18
  5. now: 8.14
  6. ---
  7. name: linux
  8. gender:

parseyaml.py

  1. import yaml
  2.  
  3. # 定义yaml文件路径
  4. yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml'
  5.  
  6. with open(yaml_path,"r",encoding="utf8") as f:
  7. context=yaml.load_all(f,Loader=yaml.FullLoader)
  8. print("读取内容",context,type(context))
  9. for i in context:
  10. print(i)

输出

  1. 读取内容 <generator object load_all at 0x000001CD07257040> <class 'generator'>
  2. {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14}
  3. {'name': 'linux超', 'gender': '男'}

结论:

当yaml文件存储多组数据在一个yaml文件中时,

需要使用3个横杆分割,

读取数据时需要使用load_all方法,

而且此方法返回一个生成器,

需要使用for循环迭代读取每一组数据下面再看一下yaml如何存储列表类型数据

3.yaml存储列表并读取

config.yaml

  1. - linux
  2. - BeiJing
  3. - petrochina
  4. - 18
  5. - 8.14

parseyaml.py

  1. import yaml
  2.  
  3. # 定义yaml文件路径
  4. yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml'
  5.  
  6. with open(yaml_path,"r",encoding="utf8") as f:
  7. context=yaml.load(f,Loader=yaml.FullLoader)
  8.  
  9. print("读取内容",context,type(context))

输出

  1. 读取内容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'>

结论

当yaml文件存储列表数据时,

需要使用一个横杠[- 元素]表示为列表的一个元素

4.yaml存储元组并读取

config.yml

  1. --- !!python/tuple # 列表转成元组
  2. - 1
  3. - 2
  4. - 3
  5. ---
  6. age: !!str 18 # int 类型转换为str

parseyaml.py

  1. import yaml
  2.  
  3. with open("./config.yml", "r", encoding="utf-8") as f:
  4. context = yaml.load_all(f, Loader=yaml.FullLoader)
  5. for i in context:
  6. print(i)

输出

  1. (1, 2, 3)
  2. {'age': '18'}
  3.  
  4. Process finished with exit code 0

结论:

yaml文件使用两个!!号可以对数据进行类型转换

config.yaml

  1. info:
  2. - user:
  3. username: linux
  4. password: linuxxiaochao
  5. company:
  6. first: petrochina
  7. second: lemon teacher

parseyaml.py

  1. import yaml
  2.  
  3. with open("config.yml", "r", encoding="utf8") as f:
  4. context = yaml.load(f, Loader=yaml.FullLoader)
  5. print("读取内容\n", context, type(context))

输出

  1. 读取内容
  2. {'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <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写入一组数据

  1. import yaml
  2.  
  3. response = {
  4. "status": 1,
  5. "code": "1001",
  6. "data": [
  7. {
  8. "id": 80,
  9. "regname": "toml",
  10. "pwd": "QW&@JBK!#&#($*@HLNN",
  11. "mobilephone": "13691579846",
  12. "leavemount": "0.00",
  13. "type": "1",
  14. "regtime": "2019-08-14 20:24:45.0"
  15. },
  16. {
  17. "id": 81,
  18. "regname": "toml",
  19. "pwd": "QW&@JBK!#&#($*@HLNN",
  20. "mobilephone": "13691579846",
  21. "leavemount": "0.00",
  22. "type": "1",
  23. "regtime": "2019-08-14 20:24:45.0"
  24. }
  25. ],
  26. "msg": "获取用户列表成功"
  27. }
  28.  
  29. try:
  30. with open("./config.yml", "w", encoding="utf-8") as f:
  31. yaml.dump(data=response, stream=f, allow_unicode=True)
  32. except Exception as e:
  33. print("写入yaml文件内容失败")
  34. raise e
  35. else:
  36. print("写入yaml文件内容成功")

生成的yaml文件内容

  1. code: '1001'
  2. data:
  3. - id: 80
  4. leavemount: '0.00'
  5. mobilephone: '13691579846'
  6. pwd: QW&@JBK!#&#($*@HLNN
  7. regname: toml
  8. regtime: '2019-08-14 20:24:45.0'
  9. type: '1'
  10. - id: 81
  11. leavemount: '0.00'
  12. mobilephone: '13691579846'
  13. pwd: QW&@JBK!#&#($*@HLNN
  14. regname: toml
  15. regtime: '2019-08-14 20:24:45.0'
  16. type: '1'
  17. msg: 获取用户列表成功
  18. status: 1

dump_all写入多组数据

  1. import yaml
  2.  
  3. response = {
  4. "status": 1,
  5. "code": "1001",
  6. "data": [
  7. {
  8. "id": 80,
  9. "regname": "toml",
  10. "pwd": "QW&@JBK!#&#($*@HLNN",
  11. "mobilephone": "13691579846",
  12. "leavemount": "0.00",
  13. "type": "1",
  14. "regtime": "2019-08-14 20:24:45.0"
  15. },
  16. {
  17. "id": 81,
  18. "regname": "toml",
  19. "pwd": "QW&@JBK!#&#($*@HLNN",
  20. "mobilephone": "13691579846",
  21. "leavemount": "0.00",
  22. "type": "1",
  23. "regtime": "2019-08-14 20:24:45.0"
  24. }
  25. ],
  26. "msg": "获取用户列表成功"
  27. }
  28.  
  29. info = {
  30. "name": "linux超",
  31. "age": 18
  32. }
  33.  
  34. try:
  35. with open("./config.yml", "w", encoding="utf-8") as f:
  36. yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True)
  37. except Exception as e:
  38. print("写入yaml文件内容失败")
  39. raise e
  40. else:
  41. print("写入yaml文件内容成功")

生成的yaml文件内容

  1. code: '1001'
  2. data:
  3. - id: 80
  4. leavemount: '0.00'
  5. mobilephone: '13691579846'
  6. pwd: QW&@JBK!#&#($*@HLNN
  7. regname: toml
  8. regtime: '2019-08-14 20:24:45.0'
  9. type: '1'
  10. - id: 81
  11. leavemount: '0.00'
  12. mobilephone: '13691579846'
  13. pwd: QW&@JBK!#&#($*@HLNN
  14. regname: toml
  15. regtime: '2019-08-14 20:24:45.0'
  16. type: '1'
  17. msg: 获取用户列表成功
  18. status: 1
  19. ---
  20. age: 18
  21. name: linux

写yaml文件小结

1.yaml存储数据规则-多组数据使用---分割,

数据嵌套时注意缩进,

存储字典使用[key: value]的形式,存储列表使用[- 元素]的形式,

使用load读一组数据,使用load_all 可以读多组数据

2.yaml文件写入一组数据直接使用dump方法,写入多组数据使用dump_all方法,

注意写入数据带中文,需要指定参数allow_unicode=True

yaml 文件解析的更多相关文章

  1. yaml文件解析详解

    前言 yaml文件是什么?yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时 ...

  2. YAML文件解析

    YAML是“另一种标记语言”的外语缩写,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述.因为不需要一个专业工具就可以排查正确性.YAML目 ...

  3. springboot中对yaml文件的解析

    一.YAML是“YAML不是一种标记语言”的外语缩写 (见前方参考资料原文内容):但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名.它是一种直观的能够被电脑识别的数据序列化 ...

  4. 使用ruamel.yaml库,解析yaml文件

    在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...

  5. python解析yaml文件

    YAML语法规则: http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/ 下载PyYAML: http://www.yaml.org/ 解压 ...

  6. 解析YAML文件

    YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean(); yamlMapFactoryBean.setResources(ne ...

  7. 用Yaml文件进行元素管理【转】

    原文:http://www.cnblogs.com/milanmi/p/4636503.html 如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要 ...

  8. selenium2入门 用Yaml文件进行元素管理 (五)

    比如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要去创建test对象.如果id号变了,我们也只需要改一下test的名称就行了. 使用Yaml需要用 ...

  9. golang yaml配置文件解析

    yaml文件语法 此模块内容转自:http://www.ruanyifeng.com/blog/2016/07/yaml.html 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使 ...

随机推荐

  1. C# 24点游戏求解算法

    经常跟儿子玩24点,有时候比较难算的,算一会儿,两人算不出来,就收了,当作没法算. 以我的数学能力,一般来说,算不出来的,大概率确实是算不出来的. 但是遇到比较变态的,当作算不出来是可能的,所以一直想 ...

  2. 孟老板 ListAdapter封装, 告别Adapter代码 (四)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  3. Ruby升级的最新方法/CocoaPods安装

    今天安装cocoapods时候出现了下面的提示 Error installing pods:active support requires Ruby version >= 2.2.0//这个需求 ...

  4. jquery鼠标移入移出事件

    <!DOCTYPE html><html> <head>    <meta http-equiv="Content-type" conte ...

  5. 四、JavaSE语言基础之运算符

    什么是是运算符 运算符:用于数据运算的符号,运算是一种处理.(注:浮点型数据(float.double)进行运算会出现精度丢失的情况) 运算符大致可分为以下六种: 一.算术运算符:+.-.*./.%. ...

  6. oscp-缓冲区溢出(持续更新)

    环境准备 Windows7虚拟机(我选了IE8,其实也没什么关系) 微软官方下载地址 These virtual machines expire after 90 days. We recommend ...

  7. 浅读tomcat架构设计和tomcat启动过程(1)

    一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...

  8. printf 格式

    1.转换说明符      %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)      %c         字符      %d         有符号十进制整数      % ...

  9. Mybatis学习(8)动态sql语句

    Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  10. shiro框架整合ssm框架

    下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...