前言

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文件解析详解的更多相关文章

  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. python基础认识(一)

    这些日子以来,新闻铺天盖地的都是人工智能,那么借着这股潮流,python也随之火起来了,现在的python不仅仅可以进行人工智能领域的开发.还可以进行web.爬虫等领域的运用.因此,我认为作为一个紧跟 ...

  2. 对于Typora(markdown)的基本使用

    对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用! 标题 (快捷键:ctrl + 数字) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ###### ...

  3. akka 集群分片

    akka 集群 Sharding分片 分片上下级结构 集群(多台节点机) —> 每台节点机(1个片区) —> 每个片区(多个分片) —> 每个分片(多个实体) 实体: 分片管理的 A ...

  4. 预学第三天:Ge常用t快捷键,码云,Git使用

    目录 Get常用快捷键 码云及Git的使用 Get常用快捷键 git init #创建一个本地的仓库 **gie add test.txt #指定文件添加 ***git add . #当前文件夹下所有 ...

  5. 洛谷P1140 相似基因

    题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...

  6. Hadoop之WritableComprale 排序

    Hadoop之WritableComprale 排序 Hadoop只对key进行排序 排序是 MapReduce 框架中最重要的操作之一.Map Task 和 Reduce Task 均会对数据(按照 ...

  7. C语言入门7-程序设计方法基础-循环结构

    程序设计方法基础-循环结构 循环三要素: 初值   循环判断条件   步长(循环增量) 循环结构在有些书籍上也称为重复结构,  即反复执行某一部分的操作. 循环三要素: 初值   循环判断条件   步 ...

  8. CentOS 7.2配置LAMP环境——yum版

    环境:CentOS 7.2 采用putty连接 方法:采用yum安装方法 目的:搭建Apache+MySQL+PHP环境 1.安装Apache yum install httpd //默认情况下,选择 ...

  9. Python基础总结之第四天开始【格式化‘字符串’】(新手可相互督促)

    年薪20万... 字符串格式化: 先看小案例-------: a = 'hello,my name is %s,I like %s.'%('XiaoHong','football') #在字符串中,[ ...

  10. 恢复在iterm2中当滚动光标时候触发滚动历史记录的问题

    在Iterm2中,如果你上下滚动光标(上下滑动触摸板.或者滚动鼠标滚轮),通常情况下是触发了屏幕内容上下滚动. 但是在某些异常情况下,却触发了命令行历史记录的上下滚动,效果和你连续按了多次键盘的上下键 ...