Python3操作YAML文件格式方法解析


Posted in Python onApril 10, 2020

数据及配置文件之争

数据及文件通常有三种类型:

  • 配置文件型:如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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows下python2.7.8安装图文教程
May 26 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
python:print格式化输出到文件的实例
May 14 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
Pytorch 中retain_graph的用法详解
Jan 07 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
Django 再谈一谈json序列化
Mar 16 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 #Python
Python 炫技操作之合并字典的七种方法
Apr 10 #Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 #Python
Python3操作读写CSV文件使用包过程解析
Apr 10 #Python
快速解决jupyter启动卡死的问题
Apr 10 #Python
Python操作Jira库常用方法解析
Apr 10 #Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 #Python
You might like
Php+SqlServer实现分页显示
2006/10/09 PHP
关于时间计算的结总
2006/12/06 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
python 文件操作api(文件操作函数)
2016/08/28 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
python:print格式化输出到文件的实例
2018/05/14 Python
anaconda如何查看并管理python环境
2019/07/05 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
好的演讲稿开场白
2013/12/30 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
总经理助理岗位职责
2015/01/31 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫