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 相关文章推荐
python 正则式 概述及常用字符
May 07 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
Python计算三角函数之asin()方法的使用
May 15 Python
在Python中操作字典之update()方法的使用
May 22 Python
python实现井字棋游戏
Mar 30 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
Python 实现选择排序的算法步骤
Apr 22 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
Python如何把十进制数转换成ip地址
May 25 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 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小偷程序)
2014/08/23 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
2010年最佳jQuery插件整理
2010/12/06 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Python读取图片属性信息的实现方法
2016/09/11 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Python字符串的修改方法实例
2019/12/19 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
几个人围成一圈的问题
2013/09/26 面试题
简历自我评价怎么写好呢?
2014/01/04 职场文书
工作交流会欢迎词
2014/01/12 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
公司委托书范本
2014/04/04 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
Python图片检索之以图搜图
2021/05/31 Python
详细介绍python操作RabbitMq
2022/04/12 Python