前言

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

PyYaml安装

yaml文件处理需要借助python的第三方库,因此我们第一步需要安装

打开CMD执行命令: pip install PyYaml  注意:不要把Yaml写成Ymal

读yaml文件

yaml存字典并读取

config.yaml

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

parseyaml.py

  1. """
  2. ------------------------------------
  3. @Time : 2019/8/14 20:37
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. with open("config.yml", "r", encoding="utf8") as f:
  15. context = yaml.load(f, Loader=yaml.FullLoader)
  16. print("读取内容", context, type(context))
  17. print(context["cnblog"], type(context["cnblog"]))
  18. print(context["age"], type(context["age"]))
  19. print(context["now"], type(context["now"]))
    print(context["empty1"], type(context["empty1"]))

输出

  1. 读取内容 {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'>
  2. linux <class 'str'>
  3. 18 <class 'int'>
  4. 8.14 <class 'float'>
  5. None <class 'NoneType'>
  6.  
  7. Process finished with exit code 0

从输出结果及yaml文件内容你可以看到,当前输出的内容是一个字典类型,yaml文件中存储的字符串输出仍是字符串类型,int型仍是int型等,存储None类型可以使用null,~符号以及None,这也是区别ini配置文件的地方,且文件内容使用[key:value]的形式定义,当然key和value也可以使用双引号修饰;上面的yaml文件只存储了一组数据,你也可以存放多组数据,看下面的实例

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. """
  2. ------------------------------------
  3. @Time : 2019/8/14 20:37
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. with open("config.yml", "r", encoding="utf8") as f:
  15. context = yaml.load_all(f, Loader=yaml.FullLoader)
  16. print(context)
  17. for i in context:
  18. print(i)

输出

  1. 我是一个生成器 <generator object load_all at 0x01DDDAB0>
  2. {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14}
  3. {'name': 'linux超', 'gender': '男'}
  4.  
  5. Process finished with exit code 0

通过输出结果及yaml存储内容可以看出,当yaml文件存储多组数据在一个yaml文件中时,需要使用3个横杆分割,读取数据时需要使用load_all方法,而且此方法返回一个生成器,需要使用for循环迭代读取每一组数据下面再看一下yaml如何存储列表类型数据

yaml存储列表并读取

config.yaml

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

parseyaml.py

  1. """
  2. ------------------------------------
  3. @Time : 2019/8/14 20:37
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. with open("config.yml", "r", encoding="utf8") as f:
  15. context = yaml.load(f, Loader=yaml.FullLoader)
  16. print("读取内容", context, type(context))

输出

  1. 读取内容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'>
  2.  
  3. Process finished with exit code 0

当yaml文件存储列表数据时,需要使用一个横杠[- 元素]表示为列表的一个元素,除了列表以外还可以存储元组,或者说支持强制类型转换

yaml存储元组并读取

config.yml

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

parseyaml.py

  1. """
  2. ------------------------------------
  3. @Time : 2019/8/14 19:46
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. with open("./config.yml", "r", encoding="utf-8") as f:
  15. context = yaml.load_all(f, Loader=yaml.FullLoader)
  16. for i in context:
  17. print(i)

输出

  1. (1, 2, 3)
  2. {'age': ''}
  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. """
  2. ------------------------------------
  3. @Time : 2019/8/14 20:37
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. with open("config.yml", "r", encoding="utf8") as f:
  15. context = yaml.load(f, Loader=yaml.FullLoader)
  16. print("读取内容\n", context, type(context))

输出

  1. 读取内容
  2. {'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <class 'dict'>
  3.  
  4. Process finished with exit code 0

小结

实际工作中大概就是存储字典,列表,或者相互嵌套的数据较常见,那么在存储和读取时需要掌握以下几点

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. """
  2. ------------------------------------
  3. @Time : 2019/8/14 19:46
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. response = {
  15. "status": 1,
  16. "code": "",
  17. "data": [
  18. {
  19. "id": 80,
  20. "regname": "toml",
  21. "pwd": "QW&@JBK!#&#($*@HLNN",
  22. "mobilephone": "",
  23. "leavemount": "0.00",
  24. "type": "",
  25. "regtime": "2019-08-14 20:24:45.0"
  26. },
  27. {
  28. "id": 81,
  29. "regname": "toml",
  30. "pwd": "QW&@JBK!#&#($*@HLNN",
  31. "mobilephone": "",
  32. "leavemount": "0.00",
  33. "type": "",
  34. "regtime": "2019-08-14 20:24:45.0"
  35. }
  36. ],
  37. "msg": "获取用户列表成功"
  38. }
  39.  
  40. try:
  41. with open("./config.yml", "w", encoding="utf-8") as f:
  42. yaml.dump(data=response, stream=f, allow_unicode=True)
  43. except Exception as e:
  44. print("写入yaml文件内容失败")
  45. raise e
  46. else:
  47. print("写入yaml文件内容成功")

生成的yaml文件内容

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

dump_all写入多组数据

  1. """
  2. ------------------------------------
  3. @Time : 2019/8/14 19:46
  4. @Auth : linux超
  5. @File : parseYaml.py
  6. @IDE : PyCharm
  7. @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
  8. @QQ : 28174043@qq.com
  9. @GROUP: 878565760
  10. ------------------------------------
  11. """
  12. import yaml
  13.  
  14. response = {
  15. "status": 1,
  16. "code": "",
  17. "data": [
  18. {
  19. "id": 80,
  20. "regname": "toml",
  21. "pwd": "QW&@JBK!#&#($*@HLNN",
  22. "mobilephone": "",
  23. "leavemount": "0.00",
  24. "type": "",
  25. "regtime": "2019-08-14 20:24:45.0"
  26. },
  27. {
  28. "id": 81,
  29. "regname": "toml",
  30. "pwd": "QW&@JBK!#&#($*@HLNN",
  31. "mobilephone": "",
  32. "leavemount": "0.00",
  33. "type": "",
  34. "regtime": "2019-08-14 20:24:45.0"
  35. }
  36. ],
  37. "msg": "获取用户列表成功"
  38. }
  39.  
  40. info = {
  41. "name": "linux超",
  42. "age": 18
  43. }
  44.  
  45. try:
  46. with open("./config.yml", "w", encoding="utf-8") as f:
  47. yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True)
  48. except Exception as e:
  49. print("写入yaml文件内容失败")
  50. raise e
  51. else:
  52. print("写入yaml文件内容成功")

生成的yaml文件内容

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

小结

1.写入一组数据直接使用dump方法或者dump_all方法也可

2.写入多组数据只能使用dump_all方法

3.写入数据时最重要的一点需要注意:如果你的数据包含中文,dump和dump_all 方法需要添加allow_unicode=True参数,否则中文写入后不会正常显示

总结

1.yaml存储数据规则-多组数据使用---分割,数据嵌套时注意缩进,存储字典使用[key: value]的形式,存储列表使用[- 元素]的形式,使用load读一组数据,使用load_all 可以读多组数据

2.yaml文件写入一组数据直接使用dump方法,写入多组数据使用dump_all方法,注意写入数据带中文,需要指定参数allow_unicode=True

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

  1. JAXB注解 @XmlRootElement 及XML文件解析详解

    @Retention(value=RUNTIME) @Target(value=TYPE) public @interface XmlRootElement @Inherited @Retention ...

  2. Android学习笔记之AndroidManifest.xml文件解析(详解)

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  3. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  4. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  6. Apache 中httpd.conf文件配置详解(转载)

    httpd.conf文件配置详解   Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现.下面让我们来看看htt ...

  7. 【Linux学习】Linux下用户组、文件权限详解

    原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...

  8. Uploadify 上传文件插件详解

    Uploadify 上传文件插件详解 Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中 ...

  9. C++文件读写详解(ofstream,ifstream,fstream)

    C++文件读写详解(ofstream,ifstream,fstream) 这里主要是讨论fstream的内容: #include <fstream> ofstream //文件写操作 内存 ...

随机推荐

  1. Spring 核心技术(3)

    接上篇:Spring 核心技术(2) version 5.1.8.RELEASE 1.4 依赖 典型的企业应用程序不会只包含单个对象(或 Spring 术语中的 bean).即使是最简单的应用程序也是 ...

  2. 彻底透析SpringBoot jar可执行原理

    ​ 文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看.同时文章是基于SpringBoot-2.1.3进行分析.涉及的知识点主要包括Maven的生命周期以及自定 ...

  3. 通讯(tarjan缩点)(20190716NOIP模拟测试4)

    B. 通讯   题目类型:传统 评测方式:文本比较  内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...

  4. 从后端到前端之Vue(一)写个表格试试水

    目录: 1.脚本式开发. 2.工程化开发 3.工程化和脚本的区别 4.来个table试试水 4,1.目标 4.2.思路 4.3.设计与编码 4.4.效果 5.业务分离 6.功能拓展——个性化设置    ...

  5. css3系列之弹性盒子 flex

    弹性盒子(伸缩盒) 注意,本篇会很长,非常长, 因为弹性盒子的知识点比较多 搜索 弹性盒子的属性  ctrl + F   如果觉得图太小, ctrl + +键 设置弹性盒子的属性: display:f ...

  6. Linux基础学习整理

    linux学习记录 下载地址 centos 下载地址: 网易镜像:http://mirrors.163.com/centos/6/isos/ 搜狐镜像:http://mirrors.sohu.com/ ...

  7. MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)

    1. 需求描述 观察MongoDB的启动Log,会看到一个关于  NUMA 的警告 和 优化建议 --17T17:: I CONTROL [initandlisten] ** WARNING: You ...

  8. 客户端内嵌Vue页面

    目前很多应用都存在网页端和客户端形式,例如常用的:钉钉.微信等.按传统的开发形式,需要为客户端开发一套界面.基于当前Web应用可以利用三大前端框架和UI框架快速开发出各种酷炫的界面,于是出现了客户端嵌 ...

  9. SCADA开源项目lite版本

    一.引子 自从看了老坏猫(江湖人称猫总)的SharpSCADA项目后,让我感觉耳目一新同时也对自动化数据采集有了更深入的认识,我相信有不少做上位机的朋友和我一样对这个项目非常好奇.我们做上位机的应用场 ...

  10. Git学习笔记 (二)

    Git学习笔记(二) 突然发现,学习新知识新技能,都得经常温故使用,这样才能日益精进.最近学习的Git是因为加入了课题组,在学习做一些后台,由于后台开发会牵扯到多人开发,所以学会Git这一代码管理工具 ...