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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 Python
python中as用法实例分析
Apr 30 Python
浅谈python中set使用
Jun 30 Python
使用python实现生成用户信息
Mar 20 Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
python解释器安装教程的方法步骤
Jul 02 Python
python实现b站直播自动发送弹幕功能
Feb 20 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
支持oicq头像的留言簿(一)
2006/10/09 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
php无限级分类实现方法分析
2016/10/19 PHP
ext 代码生成器
2009/08/07 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
js常用排序实现代码
2010/12/28 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
js实现碰撞检测
2021/01/29 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Pytorch之保存读取模型实例
2019/12/30 Python
执行Python程序时模块报错问题
2020/03/26 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Python实现上下文管理器的方法
2020/08/07 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
见习期自我鉴定
2013/11/07 职场文书
租车协议书范本
2014/04/22 职场文书
个人课题方案
2014/05/08 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
基层党建工作简报
2015/07/21 职场文书
教师病假条范文
2015/08/17 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python