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

作者:临渊 时间:2021-05-22 03:57:10 

数据及配置文件之争

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

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

来源:https://www.cnblogs.com/superhin/p/11503756.html

标签:Python,操作,YAML,文件
0
投稿

猜你喜欢

  • python3写的简单本地文件上传服务器实例

    2023-08-23 02:50:58
  • PHP cookie,session的使用与用户自动登录功能实现方法分析

    2023-11-21 15:00:43
  • 使用ERWin进行基于MySQL数据库的物理设计

    2009-01-04 12:54:00
  • 解析WordPress中函数钩子hook的作用及基本用法

    2023-07-08 03:27:52
  • thinkphp3.x连接mysql数据库的方法(具体操作步骤)

    2023-11-22 20:04:41
  • SQL Server元数据的管理与应用

    2009-03-16 14:24:00
  • JS轮播图中缓动函数的封装

    2023-08-22 20:50:11
  • Python基础 while循环与break、continue关键字

    2023-11-19 03:41:42
  • 用ASP实现txt,doc,jpg等文件下载的函数

    2007-08-17 13:17:00
  • ASP内置对象Request和Response用法详解

    2007-09-14 10:35:00
  • 关于交互设计在QQ秀赠送流程中的优化

    2009-06-11 12:30:00
  • 解析Go 中的 rune 类型

    2023-09-19 11:59:16
  • mysql主从服务器配置特殊问题

    2011-01-04 19:56:00
  • JSONObject.toString

    2008-03-09 19:12:00
  • 类似google的ASP分页代码[测试通过]

    2009-03-13 12:43:00
  • 请正确认识MySQL对服务器端光标的限制

    2008-12-17 14:58:00
  • Mysql中limit的用法方法详解与注意事项

    2023-11-16 09:20:05
  • go语言数据结构之前缀树Trie

    2023-08-05 18:15:50
  • 6个asp判断函数使用方法介绍

    2007-09-24 13:10:00
  • 如何使div在任何分辩率的情况下居中

    2007-08-13 09:10:00
  • asp之家 网络编程 m.aspxhome.com