python中使用yaml模块
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中使用yaml模块相关的知识,希望对你有一定的参考价值。
1. yaml文件介绍
YAML是一种简洁的非标记语言,用来写配置文件非常方便。其以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁。
- 安装yaml
pip3 install pyyaml
导入的模块为yaml(import yaml)
- yaml文件的规则
大小写敏感
;- 使用
缩进
表示层级关系;- 使用
空格键缩进,而非Tab
键缩进- 缩进的
空格数目不重要
,只需要相同层级的元素左侧对齐
;- 文件中的字符串不需要使用引号标注,但若
字符串包含有特殊字符则需用引号标注
;- 注释标识为#
- yaml文件数据结构
对象
:键值对的集合(简称 “映射或字典”)
键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
数组
:一组按序排列的值(简称 “序列或列表”)
数组前加有 “-” 符号,符号与值之间需用空格分隔
纯量
(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
None值可用null,也可 ~ 表示
典型的yaml数据格式以及对应的python输出类型如下:
# 1. 对象:yaml键值对:即python中字典
usr: my
psw: 123455
s: " abc\\n"
#解析后:'usr': 'my', 'psw': 123455, 's': ' abc\\n'
# 2. 数组:yaml键值对中嵌套数组
usr3:
- a
- b
- c
usr4:
- b
#解析后:'usr3': ['a', 'b', 'c'], 'usr4': ['b']
# 3. 纯量
s_val: name # 字符串:'s_val': 'name'
spec_s_val: "name\\n" # 特殊字符串:'spec_s_val': 'name\\n'
num_val: 31.14 # 数字:'num_val': 31.14
bol_val: true # 布尔值:'bol_val': True
nul_val: null # null值:'nul_val': None
nul_val1: ~ # null值:'nul_val1': None
time_val: 2018-03-01t11:33:22.55-06:00 # 时间值:'time_val': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)
date_val: 2019-01-10 # 日期值:'date_val': datetime.date(2019, 1, 10)
# 4. 引用
name: &name 灰蓝
tester: *name
# 相当于
name: 灰蓝
tester: 灰蓝
#解析后内容:'name': '灰蓝', 'tester': '灰蓝'
# 5. 强制转换
str: !!str 3.14
int: !!int "123"
# 输出:'int': 123, 'str': '3.14'
2. 读取yaml
2.1 读取嵌套键值对
yaml文件内容为:
# yaml键值对嵌套:即python中字典嵌套字典
usr1:
name: a
psw: 123
usr2:
name: b
psw: 456
程序代码如下:
import yaml
import os
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "test.yaml")
file = open(yaml_path, 'r', encoding="utf-8")
file_data = file.read() #读取file内容
file.close()
print(type(file_data))
print(file_data)
#*****************转化为字典***************
data = yaml.load(file_data) #转换为字典类型
print(type(data))
print(data)
输出如下,可以看出注释内容也打印
出来了。
<class 'str'>
# yaml键值对嵌套:即python中字典嵌套字典
usr1:
name: a
psw: 123
usr2:
name: b
psw: 456
<class 'dict'>
'usr1': 'name': 'a', 'psw': 123, 'usr2': 'name': 'b', 'psw': 456
2.2 读取数组类型
yaml文件内容为:
# yaml键值对中嵌套数组
usr3:
- a
- b
- c
usr4:
- b
同样使用上述代码,输出为:
<class 'str'>
# yaml键值对中嵌套数组
usr3:
- a
- b
- c
usr4:
- b
<class 'dict'>
'usr3': ['a', 'b', 'c'], 'usr4': ['b']
3. python对象生成yaml文档
3.1 dump方法
通过yaml.dump()方法不会将列表或字典数据进行转化yaml标准模式,只会将数据生成到yaml文档中
。
# 将python对象生成yaml文档
import os
import yaml
def generate_yaml_doc(yaml_file):
py_object = 'school': 'zhang',
'students': ['a', 'b']
file = open(yaml_file, 'w', encoding='utf-8')
yaml.dump(py_object, file)
file.close()
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc(yaml_path)
输出generate.yaml中的内容为:
school: zhang
students: [a, b]
3.2 ruamel模块的方法
ruamel会将数据转换为标准的yaml内容。
- 准备
- 安装:pip3 install ruamel.yaml
- 导入模块:from ruamel import yaml
示例程序:
import os
def generate_yaml_doc_ruamel(yaml_file):
from ruamel import yaml
py_object = 'school': 'zhang',
'students': ['a', 'b']
file = open(yaml_file, 'w', encoding='utf-8')
yaml.dump(py_object, file, Dumper=yaml.RoundTripDumper)
file.close()
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc_ruamel(yaml_path)
输出的generate.yaml中的内容为:
school: zhang
students:
- a
- b
以上是关于python中使用yaml模块的主要内容,如果未能解决你的问题,请参考以下文章