yaml文件解析详解
前言
yaml文件是什么?yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时都会原样输出,yaml文件依赖python的第三方库PyYaml模块
PyYaml安装
yaml文件处理需要借助python的第三方库,因此我们第一步需要安装
打开CMD执行命令: pip install PyYaml 注意:不要把Yaml写成Ymal
读yaml文件
yaml存字典并读取
config.yaml
- cnblog: linux超
- address: BeiJing
- Company: petrochina
- age: 18
- now: 8.14
- empty1: null
- empty2: ~
parseyaml.py
- """
- ------------------------------------
- @Time : 2019/8/14 20:37
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- with open("config.yml", "r", encoding="utf8") as f:
- context = yaml.load(f, Loader=yaml.FullLoader)
- print("读取内容", context, type(context))
- print(context["cnblog"], type(context["cnblog"]))
- print(context["age"], type(context["age"]))
- print(context["now"], type(context["now"]))
print(context["empty1"], type(context["empty1"]))
输出
- 读取内容 {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'>
- linux超 <class 'str'>
- 18 <class 'int'>
- 8.14 <class 'float'>
- None <class 'NoneType'>
- Process finished with exit code 0
从输出结果及yaml文件内容你可以看到,当前输出的内容是一个字典类型,yaml文件中存储的字符串输出仍是字符串类型,int型仍是int型等,存储None类型可以使用null,~符号以及None,这也是区别ini配置文件的地方,且文件内容使用[key:value]的形式定义,当然key和value也可以使用双引号修饰;上面的yaml文件只存储了一组数据,你也可以存放多组数据,看下面的实例
yaml存多组数据并读取
config.yaml
- cnblog: linux超
- address: BeiJing
- Company: petrochina
- age: 18
- now: 8.14
- ---
- name: linux超
- gender: 男
parseyaml.py
- """
- ------------------------------------
- @Time : 2019/8/14 20:37
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- with open("config.yml", "r", encoding="utf8") as f:
- context = yaml.load_all(f, Loader=yaml.FullLoader)
- print(context)
- for i in context:
- print(i)
输出
- 我是一个生成器 <generator object load_all at 0x01DDDAB0>
- {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14}
- {'name': 'linux超', 'gender': '男'}
- Process finished with exit code 0
通过输出结果及yaml存储内容可以看出,当yaml文件存储多组数据在一个yaml文件中时,需要使用3个横杆分割,读取数据时需要使用load_all方法,而且此方法返回一个生成器,需要使用for循环迭代读取每一组数据下面再看一下yaml如何存储列表类型数据
yaml存储列表并读取
config.yaml
- - linux超
- - BeiJing
- - petrochina
- - 18
- - 8.14
parseyaml.py
- """
- ------------------------------------
- @Time : 2019/8/14 20:37
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- with open("config.yml", "r", encoding="utf8") as f:
- context = yaml.load(f, Loader=yaml.FullLoader)
- print("读取内容", context, type(context))
输出
- 读取内容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'>
- Process finished with exit code 0
当yaml文件存储列表数据时,需要使用一个横杠[- 元素]表示为列表的一个元素,除了列表以外还可以存储元组,或者说支持强制类型转换
yaml存储元组并读取
config.yml
- --- !!python/tuple # 列表转成元组
- - 1
- - 2
- - 3
- ---
- age: !!str 18 # int 类型转换为str
parseyaml.py
- """
- ------------------------------------
- @Time : 2019/8/14 19:46
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- with open("./config.yml", "r", encoding="utf-8") as f:
- context = yaml.load_all(f, Loader=yaml.FullLoader)
- for i in context:
- print(i)
输出
- (1, 2, 3)
- {'age': ''}
- Process finished with exit code 0
yaml文件使用两个!!号可以对数据进行类型转换,但是在我看来感觉没有用,当然可能我没遇见过需要做类型转化的情况;你还可以像下面这样存放更加复杂的数据,比如字典嵌套字典及列表
config.yaml
- info:
- - user:
- username: linux超
- password: linuxxiaochao
- company:
- first: petrochina
- second: lemon teacher
parseyaml.py
- """
- ------------------------------------
- @Time : 2019/8/14 20:37
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- with open("config.yml", "r", encoding="utf8") as f:
- context = yaml.load(f, Loader=yaml.FullLoader)
- print("读取内容\n", context, type(context))
输出
- 读取内容
- {'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <class 'dict'>
- 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写入一组数据
- """
- ------------------------------------
- @Time : 2019/8/14 19:46
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- response = {
- "status": 1,
- "code": "",
- "data": [
- {
- "id": 80,
- "regname": "toml",
- "pwd": "QW&@JBK!#&#($*@HLNN",
- "mobilephone": "",
- "leavemount": "0.00",
- "type": "",
- "regtime": "2019-08-14 20:24:45.0"
- },
- {
- "id": 81,
- "regname": "toml",
- "pwd": "QW&@JBK!#&#($*@HLNN",
- "mobilephone": "",
- "leavemount": "0.00",
- "type": "",
- "regtime": "2019-08-14 20:24:45.0"
- }
- ],
- "msg": "获取用户列表成功"
- }
- try:
- with open("./config.yml", "w", encoding="utf-8") as f:
- yaml.dump(data=response, stream=f, allow_unicode=True)
- except Exception as e:
- print("写入yaml文件内容失败")
- raise e
- else:
- print("写入yaml文件内容成功")
生成的yaml文件内容
- code: ''
- data:
- - id: 80
- leavemount: '0.00'
- mobilephone: ''
- pwd: QW&@JBK!#&#($*@HLNN
- regname: toml
- regtime: '2019-08-14 20:24:45.0'
- type: ''
- - id: 81
- leavemount: '0.00'
- mobilephone: ''
- pwd: QW&@JBK!#&#($*@HLNN
- regname: toml
- regtime: '2019-08-14 20:24:45.0'
- type: ''
- msg: 获取用户列表成功
- status: 1
dump_all写入多组数据
- """
- ------------------------------------
- @Time : 2019/8/14 19:46
- @Auth : linux超
- @File : parseYaml.py
- @IDE : PyCharm
- @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
- @QQ : 28174043@qq.com
- @GROUP: 878565760
- ------------------------------------
- """
- import yaml
- response = {
- "status": 1,
- "code": "",
- "data": [
- {
- "id": 80,
- "regname": "toml",
- "pwd": "QW&@JBK!#&#($*@HLNN",
- "mobilephone": "",
- "leavemount": "0.00",
- "type": "",
- "regtime": "2019-08-14 20:24:45.0"
- },
- {
- "id": 81,
- "regname": "toml",
- "pwd": "QW&@JBK!#&#($*@HLNN",
- "mobilephone": "",
- "leavemount": "0.00",
- "type": "",
- "regtime": "2019-08-14 20:24:45.0"
- }
- ],
- "msg": "获取用户列表成功"
- }
- info = {
- "name": "linux超",
- "age": 18
- }
- try:
- with open("./config.yml", "w", encoding="utf-8") as f:
- yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True)
- except Exception as e:
- print("写入yaml文件内容失败")
- raise e
- else:
- print("写入yaml文件内容成功")
生成的yaml文件内容
- code: ''
- data:
- - id: 80
- leavemount: '0.00'
- mobilephone: ''
- pwd: QW&@JBK!#&#($*@HLNN
- regname: toml
- regtime: '2019-08-14 20:24:45.0'
- type: ''
- - id: 81
- leavemount: '0.00'
- mobilephone: ''
- pwd: QW&@JBK!#&#($*@HLNN
- regname: toml
- regtime: '2019-08-14 20:24:45.0'
- type: ''
- msg: 获取用户列表成功
- status: 1
- ---
- age: 18
- 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文件解析详解的更多相关文章
- JAXB注解 @XmlRootElement 及XML文件解析详解
@Retention(value=RUNTIME) @Target(value=TYPE) public @interface XmlRootElement @Inherited @Retention ...
- Android学习笔记之AndroidManifest.xml文件解析(详解)
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- 史上最全的maven pom.xml文件教程详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 转载 Spring、Spring MVC、MyBatis整合文件配置详解
Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...
- Apache 中httpd.conf文件配置详解(转载)
httpd.conf文件配置详解 Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现.下面让我们来看看htt ...
- 【Linux学习】Linux下用户组、文件权限详解
原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...
- Uploadify 上传文件插件详解
Uploadify 上传文件插件详解 Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中 ...
- C++文件读写详解(ofstream,ifstream,fstream)
C++文件读写详解(ofstream,ifstream,fstream) 这里主要是讨论fstream的内容: #include <fstream> ofstream //文件写操作 内存 ...
随机推荐
- Spring 核心技术(3)
接上篇:Spring 核心技术(2) version 5.1.8.RELEASE 1.4 依赖 典型的企业应用程序不会只包含单个对象(或 Spring 术语中的 bean).即使是最简单的应用程序也是 ...
- 彻底透析SpringBoot jar可执行原理
文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看.同时文章是基于SpringBoot-2.1.3进行分析.涉及的知识点主要包括Maven的生命周期以及自定 ...
- 通讯(tarjan缩点)(20190716NOIP模拟测试4)
B. 通讯 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...
- 从后端到前端之Vue(一)写个表格试试水
目录: 1.脚本式开发. 2.工程化开发 3.工程化和脚本的区别 4.来个table试试水 4,1.目标 4.2.思路 4.3.设计与编码 4.4.效果 5.业务分离 6.功能拓展——个性化设置 ...
- css3系列之弹性盒子 flex
弹性盒子(伸缩盒) 注意,本篇会很长,非常长, 因为弹性盒子的知识点比较多 搜索 弹性盒子的属性 ctrl + F 如果觉得图太小, ctrl + +键 设置弹性盒子的属性: display:f ...
- Linux基础学习整理
linux学习记录 下载地址 centos 下载地址: 网易镜像:http://mirrors.163.com/centos/6/isos/ 搜狐镜像:http://mirrors.sohu.com/ ...
- MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)
1. 需求描述 观察MongoDB的启动Log,会看到一个关于 NUMA 的警告 和 优化建议 --17T17:: I CONTROL [initandlisten] ** WARNING: You ...
- 客户端内嵌Vue页面
目前很多应用都存在网页端和客户端形式,例如常用的:钉钉.微信等.按传统的开发形式,需要为客户端开发一套界面.基于当前Web应用可以利用三大前端框架和UI框架快速开发出各种酷炫的界面,于是出现了客户端嵌 ...
- SCADA开源项目lite版本
一.引子 自从看了老坏猫(江湖人称猫总)的SharpSCADA项目后,让我感觉耳目一新同时也对自动化数据采集有了更深入的认识,我相信有不少做上位机的朋友和我一样对这个项目非常好奇.我们做上位机的应用场 ...
- Git学习笔记 (二)
Git学习笔记(二) 突然发现,学习新知识新技能,都得经常温故使用,这样才能日益精进.最近学习的Git是因为加入了课题组,在学习做一些后台,由于后台开发会牵扯到多人开发,所以学会Git这一代码管理工具 ...