Python3操作YAML文件
数据及配置文件之争
数据及文件通常有三种类型:
- 配置文件型:如ini,conf,properties文件,适合存储简单变量和配置项,最多支持两层,不适合存储多层嵌套数据
- 表格矩阵型:如csv,excel等,适合于存储大量同类数据,不适合存储层级结构的数据
- 多层嵌套型:如XML,HTMl,JSON、YAML,TOML等,适合存储单条或少数多层嵌套数据,不适合存储大量数据
YAML兼容JSON格式,简洁,强大,灵活,可以很方便的构造层级数据并快速转为Python中的字典。
YAML简介
YAML(YAML Ain't Markup Language)即一种反标记(XML)语言。强调数据为中心,而非标记。YAML大小写敏感,使用缩进代表层级关系。
YAML中支持对象Object(对应Python中的字典), 数组Array(对应Python中的列表)以及常量(字符串、数字(int/float),true/false/null)。
相比于JSON格式,YAML免除了双引号,逗号,大括号,中括号等,(当然也支持原始的JSON格式),并且支持注释,类型转换,跨行,锚点,引用及插入等等。
基本格式
- 对象:使用
key: value
表示,冒号后面有一个空格,也可以是使用{key: value}
(flow流格式)或{"key": "value"}
表示 - 数组:使用
- value
表示,-后面有一个空格,每项一行,也可以使用[value1,value2,value3,...]
(flow流格式)或["value1", "value2", "value3", ...]
- 字符串:
abc
或"abc"
- 数字:
123
或123.45
- true/false:
true
/false
,TRUE
/FALSE
,True
/False
或on
/off
,ON
/OFF
,On
/Off
- null:
null
,NULL
,Null
或~
示例文件demo.yaml
:
# 注释:示例yaml文件
name: Cactus
age: 18
skills:
-
- Python
- 3
-
- Java
- 5
has_blog: true
gf: ~
相当于以下JSON格式
{
"name": "Cactus",
"age": 18,
"skills": [
[
"Python",
3
],
[
"Java",
5
]
],
"has_blog": true,
"gf": null
}
类型转换
使用!!str
, !!float
等可以将默认类型转为指定类型,如
- !!float 3
- !!str 4
- !!str true
对应JSON格式
[
3.0,
"4",
"true"
]
多行文本及拼接
|
保留多行文本(保留换行符)>
将多行拼接为一行
示例:
a: |
我
喜欢你
b: >
我
不喜欢你
才怪
对应JSON格式
{
"a": "我\n喜欢你\n",
"b": "我 不喜欢你 才怪"
}
锚点,引用及插入
在-
或:
后 加上&锚点名
为当前字段建立锚点,下面可使用*锚点名
引用锚点,或使用<<: *锚点名
直接将锚点数据插入到当前的数据中,示例如下:
users:
- &zs
name: 张三
password: !!str 123456
- &ls
name: 李四
password: abcdefg
case1:
login: *zs
case2:
user:
<<: *ls
age: 20
对应JSON格式:
{
"users": [
{
"name": "张三",
"password": "123456"
},
{
"name": "李四",
"password": "abcdefg"
}
],
"case1": {
"login": {
"name": "张三",
"password": "123456"
}
},
"case2": {
"user": {
"name": "李四",
"password": "abcdefg",
"age": 20
}
}
}
Python操作YAML文件及字符串
需要安装pyyaml,
pip install pyyaml
和JSON文件类似,yaml也提供load和dump两种方法。
yaml.load()
或yaml.safe_load(YAML字符串或文件句柄)
:yaml -> 字典,如yaml中有中文,需要使用字符串.encode('utf-8')
或打开文件时指定encoding='utf-8'
yaml.dump(字典)
:默认为flow流格式,即字典{b': {'c': 3, 'd': 4}}
,会被转为b: {c: 3, d: 4}
形式,可以使用default_flow_style=False
关闭流模式
由于
yaml.load()
支持原生Python对象,不安全,建议使用yaml.safe_load()
示例1:yaml字符串 -> 字典
import yaml
yaml_str = '''
name: Cactus
age: 18
skills:
-
- Python
- 3
-
- Java
- 5
has_blog: true
gf: ~
'''
print(yaml.safe_load(yaml_str))
打印结果:
{'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
如果有中文,可以使用
yaml.load(yaml_str.encoding('utf-8))
示例2:yaml文件 -> 字典
import yaml
with open('demo.yaml', encoding='utf-8') as f: # demo.yaml内容同上例yaml字符串
print(yaml.safe_load(f))
打印结果同上例。
字典 -> yaml字符串或文件
import yaml
dict_var = {'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
print(yaml.dump(dict_var,)) # 转为字符串,使用默认flow流格式
with open('demo5.yaml', 'w', encoding='utf-8') as f:
yaml.dump(dict_var, f, default_flow_style=False) # 写入文件,不是用flow流格式
打印内容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- [Python, 3]
- [Java, 5]
1demo5.yaml1文件内容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- - Python
- 3
- - Java
- 5
更多操作可参考pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation
Python3操作YAML文件的更多相关文章
- Python操作yaml文件
基本的yaml语法 http://ansible-tran.readthedocs.io/en/latest/docs/YAMLSyntax.html YAML 还有一个小的怪癖. 所有的 YAML ...
- Python - 通过PyYaml库操作YAML文件
PyYaml简单介绍 Python的PyYAML模块是Python的YAML解析器和生成器 它有个版本分水岭,就是5.1 读取YAML5.1之前的读取方法 def read_yaml(self, pa ...
- python操作YAML文件之pyyaml库
1. YAML简介 YAML是一种被认为可以超越XML.JSON的配置文件,最早接触是Spring Boot,木有想到python也是支持的,遂研究一下. python解析YAML库叫做pyyaml, ...
- 【学习笔记】python3中yaml文件使用
1.yaml -> 字典:用yaml.load()或yaml.safe_load(YAML字符串或文件句柄),如yaml中有中文,可以使用.encode('utf-8')或打开文件时指定enco ...
- python基础-PyYaml操作yaml文件
yaml语法 格式 它的基本语法规则如下 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 YAML 支持的数据结构有 ...
- python 操作yaml文件
yaml 5.1版后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数yaml 5.1之 ...
- 使用KubeOperator安装k8s集群后,节点主机yaml文件路径
[root@k8s-develop-master-1 kubernetes]# cd /etc/kubernetes [root@k8s-develop-master-1 kubernetes]# l ...
- 对XML和YAML文件实现I/O操作
1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStora ...
- OPENCV(3) —— 对XML和YAML文件实现I/O 操作
XML\YAML文件在OpenCV中的数据结构为FileStorage string filename = "I.xml"; FileStorage fs(filename, Fi ...
随机推荐
- MySQL 军规
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...
- SQL Server系统函数:元数据函数
原文:SQL Server系统函数:元数据函数 1.列的长度.列名 --列的长度 select COL_LENGTH('dbo.wct', --表名 'wcid') --列名 --列名 select ...
- 体验三大JavaScript文件上传库(Uppy.js/Filepond/Dropzone)
最近发现了一个高颜值的前端上传组件Uppy.js,立即上手体验了一波,感觉还不错.然后又看到同类型的Filepond以及Dropzone.js,对比体验了一下,感觉都很优秀,但是在体验过程中,都遇到了 ...
- 【原创】大叔经验分享(94)jdbc连接mysql、sqlserver、oracle
Mysql driver下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java import java.sql.*; publ ...
- Linux Jetbrains Datagrip 图标找不到
问题 系统版本:Ubuntu 18.04,Datagrip版本:2019.2 从官网下载的 tar.gz 解压之后,找到 datagrip.sh 就可以使用了.但是有个问题,它没有自动创建快捷方式,所 ...
- S2-019、S2-020
前言 “Struts2系列起始篇”是我整各系列的核心,希望大家能花些时间先看看. 正文 我发现关于一些早期的Struts2的漏洞,网上的分析文章并不多,不知道是不是我打开浏览器的方式不对,唯一看到的两 ...
- 深度学习_1_Tensorflow_2_数据_文件读取
tensorflow 数据读取 队列和线程 文件读取, 图片处理 问题:大文件读取,读取速度, 在tensorflow中真正的多线程 子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全 ...
- vuejs开发流程
https://www.cnblogs.com/yexiaowang/p/8489250.html
- linux命令详解——eval
shell中的eval 功能说明:重新运算求出参数的内容. 语 法:eval [参数] 补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行. 参 数:参数不限数目,彼此之间用分号分开. ...
- deep_learning_Github_初学者教程
Github_link_from:https://github.com/lawlite19/MachineLearning_Python 机器学习算法Python实现 目录 机器学习算法Python实 ...