python脚本文件格式_Python3操作YAML文件格式方法解析

数据及配置文件之争

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

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

<<:>

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值