python中yaml模块的使⽤_详解Python中Pyyaml模块的使⽤⼀、YAML是什么
YAML是专门⽤来写配置⽂件的语⾔,远⽐JSON格式⽅便。
YAML语⾔的设计⽬标,就是⽅便⼈类读写。
YAML是⼀种⽐XML和JSON更轻的⽂件格式,也更简单更强⼤,它可以通过缩进来表⽰结构,是不是听起来就和Python很搭?
顾名思义,⽤语⾔编写的⽂件就可以称之为YAML⽂件。PyYaml是Python的⼀个专门针对YAML⽂件操作的模块,使⽤起来⾮常简单
安装 pip install pyyaml # 如果是py2,使⽤ pip install yaml
⼆、PyYaml的简单使⽤
使⽤起来⾮常简单,就像json、pickle⼀样,load、dump就⾜够我们使⽤了。
load()⽰例:返回⼀个对象
import yaml
yaml_str = """
name: ⼀条⼤河
age: 1956
job: Singer
"""
y = yaml.load(yaml_str, Loader=yaml.SafeLoader)
print(y)
运⾏结果:
{'name': '⼀条⼤河', 'age': 1956, 'job': 'Singer'}
load_all()⽰例:⽣成⼀个迭代器
如果string或⽂件包含⼏块yaml⽂档,可以使⽤yaml.load_all来解析全部的⽂档。
yaml_test.yaml⽂件内容:
---
name: qiyu
age: 20岁
---
name: qingqing
age: 19岁
操作yaml⽂件的test.py⽂件如下:
import yaml
with open("./yaml_test", 'r', encoding='utf-8') as ymlfile:
cfg = yaml.load_all(ymlfile, Loader=yaml.SafeLoader)
for data in cfg:
运⾏结果:
{'name': 'qiyu', 'age': '20岁'}
{'name': 'qingqing', 'age': '19岁'}
dump()⽰例:将⼀个python对象⽣成为yaml⽂档
import yaml
json_data = {'name': '⼀条⼤河',python怎么读取py文件
'age': 1956,
'job': ['Singer','Dancer']}
y = yaml.dump(json_data, default_flow_style=False).encode('utf-8').decode('unicode_escape') print(y)
运⾏结果:
age: 1956
job:
- Singer
- Dancer
name: "⼀条⼤河"
使⽤dump()传⼊参数,可以直接把内容写⼊到yaml⽂件:
import yaml
json_data = {'name': '⼀条⼤河',
'age': 1956,
'job': ['Singer', 'Dancer']}
with open('./yaml_write.yaml', 'w') as f:
y = yaml.dump(json_data, f)
print(y)
写⼊内容后的yaml_write.yaml:
yaml.dump_all()⽰例:将多个段输出到⼀个⽂件中
import yaml
obj1 = {"name": "river", "age": 2019}
obj2 = ["Lily", 1956]
obj3 = {"gang": "ben", "age": 1963}
obj4 = ["Zhuqiyu", 1994]
with open('./yaml_write_all.yaml', 'w', encoding='utf-8') as f:
y = yaml.dump([obj1, obj2, obj3, obj4], f)
with open('./yaml_write_all.yaml', 'r') as r:
y1 = yaml.load(r, Loader=yaml.SafeLoader)
print(y1)
写⼊内容后的yaml_write_all.yaml:
为什么写⼊⽂件后的格式有的带1个“-”,有的带2个“-”?
为什么yaml⽂件读出来的的格式是List?
三、YAML的语法规则和数据结构
看完了以上4个简单的⽰例,现在就来总结下YAML语⾔的基本语法
YAML 基本语法规则如下:
1、⼤⼩写敏感
2、使⽤缩进表⽰层级关系
3、缩进时不允许使⽤Tab键,只允许使⽤空格。
4、缩进的空格数⽬不重要,只要相同层级的元素左侧对齐即可
5、# 表⽰注释,从这个字符⼀直到⾏尾,都会被解析器忽略,这个和python的注释⼀样
6、列表⾥的项⽤"-"来代表,字典⾥的键值对⽤":"分隔
知道了语法规则,现在来回答下上⾯的2个问题:
1、带1个“-”表⽰不同的模块(单个数组或者字典),带2个“-”是因为数组中元素以“-”开始,加上表⽰不同模块的那⼀个“-”,呈现出来就是2个“-”
2、因为yaml⽂件中包含多个模块(多个数组或者字典),读取出来的是这些模块的⼀个集合
3、有且只有当yaml⽂件中只有1个字典时,读取出来的数据的类型也是字典
YAML ⽀持的数据结构有3种:
1、对象:键值对的集合
2、数组:⼀组按次序排列的值,序列(sequence) 或 列表(list)
3、纯量(scalars):单个的、不可再分的值,如:字符串、布尔值、整数、浮点数、Null、时间、⽇期
⽀持数据⽰例:
yaml_test_data.yaml的内容:
str: "Big River" #字符串
int: 1548 #整数
float: 3.14 #浮点数
boolean: true #布尔值
None: null # 也可以⽤ ~ 号来表⽰ null
time: '2019-11-20T08:47:46.576701+00:00' # 时间,ISO8601
date: 2019-11-20 16:47:46.576702 # ⽇期
import yaml
import datetime
import pytz
yaml_data = {
"str": "Big River",
"int": 1548,
"float": 3.14,
'boolean': True,
"None": None,
'time': w(tz=pytz.timezone('UTC')).isoformat(),
'date': day()
}
with open('./yaml_test', 'w') as f:
y = yaml.dump(yaml_data, f)
print(y)
with open('./yaml_test', 'r') as r:
y1 = yaml.load(r, Loader=yaml.SafeLoader)
print(y1)
控制台输出:
其他语法规则
1、如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,就需要加引号了
2、引⽤
& 和 * ⽤于引⽤
name: &name SKP
tester: *name
运⾏结果:
{'name': 'SKP', 'tester': 'SKP'}
3、强制转换
⽤ !! 实现
str: !!str 3.14
int: !!int "123"
运⾏结果:
{'int': 123, 'str': '3.14'}
4、分段
在同⼀个yaml⽂件中,可以⽤“—”3个“-”来分段,这样可以将多个⽂档写在⼀个⽂件中举例见上述load_all()⽰例
四、python对象⽣成yaml⽂档
1、yaml.dump()⽅法
import yaml
import os
def generate_yaml_doc(yaml_file):
py_object = {'school': 'zhu',
'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)
"""结果
school: zhu
students:
- a
- b
"""
2、使⽤ruamel模块中的yaml⽅法⽣成标准的yaml⽂档
import os
from ruamel import yaml # pip3 install ruamel.yaml
def generate_yaml_doc_ruamel(yaml_file):
py_object = {'school': 'zhu',
'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")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。