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 相关文章推荐
在Django的视图中使用数据库查询的方法
Jul 16 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python实现连续图文识别
Dec 18 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
基于python判断目录或者文件代码实例
Nov 29 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 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 curl库实现整站克隆功能
2015/02/12 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
VSCode搭建Vue项目的方法
2020/04/30 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
Python自动发邮件脚本
2017/03/31 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python3对接mysql数据库实例详解
2019/04/30 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
Python实现井字棋小游戏
2020/03/09 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
django使用channels实现通信的示例
2020/10/19 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
求职简历中个人的自我评价
2013/12/01 职场文书
试用期员工考核制度
2014/01/22 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
大学生军训感想
2014/02/16 职场文书
安全生产汇报材料
2014/02/17 职场文书
医德医风自我评价
2014/09/19 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
出国留学导师推荐信
2015/03/26 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL