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使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
Python中强大的命令行库click入门教程
Dec 26 Python
python 基础教程之Map使用方法
Jan 17 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
python操作列表的函数使用代码详解
Dec 28 Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
django 中QuerySet特性功能详解
Jul 25 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
Oct 24 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 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目录与文件操作
2011/12/30 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
再论Javascript的类继承
2011/03/05 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python的unittest测试类代码实例
2017/12/07 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
《我的信念》教学反思
2014/02/15 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
十岁生日答谢词
2015/01/05 职场文书
春节慰问信范文
2015/02/15 职场文书
大学生实习推荐信
2015/03/27 职场文书
《迟到》教学反思
2016/02/24 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书