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:
print(data)
运行结果:
{'name': 'qiyu', 'age': '20岁'}
{'name': 'qingqing', 'age': '19岁'}
dump()示例:将一个python对象生成为yaml文档
import yaml
json_data = {'name': '一条大河',
'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)
print(y)
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': datetime.datetime.now(tz=pytz.timezone('utc')).isoformat(),
'date': datetime.datetime.today()
}
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")
generate_yaml_doc_ruamel(yaml_path)
"""结果
school: zhu
students:
- a
- b
"""
使用ruamel模块中的yaml方法读取yaml文档(用法与单独import yaml模块一致)
import os
from ruamel import yaml
def get_yaml_data_ruamel(yaml_file):
file = open(yaml_file, 'r', encoding='utf-8')
data = yaml.load(file, loader=yaml.loader)
file.close()
print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
get_yaml_data_ruamel(yaml_path)
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
python中yaml模块的使用_Python中Pyyaml模块的使用相关推荐
- Python基础_第3章_Python中的循环结构
Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...
- Python基础_第5章_Python中的数据序列
Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...
- python中模块和函数_Python中函数和模块的体验与使用
函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...
- python中导入模块的方式_Python中几种导入模块的方式总结
模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入.常见的方式有如下几种: 1 . import >>> import sys >>> sys.path ...
- python中path语句什么意思_python中jsonpath模块有何用法?
小编做项目的时候,遇到一个问题,虽然解决了,但是也是深入的思考的一番,遇到问题是这样的,我们返回的基本格式都是json,但是json都是层层递进的,如果想审核json中心找到字符串等内容,要一层一层的 ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...
一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...
- python中导入模块有哪些_python有三种导入模块的方法
原博文 2011-05-24 10:54 − python有三种导入模块的方法 其一, import modname : 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了 ...
- python sys模块 argv用法_python中sys模块的argv
"""笨办法学python,启动时在命令行中python 脚本文件名 filename"""from sys import argv# ar ...
最新文章
- Spring的PropertyPlaceholderConfigurer事例应用
- java学习笔记(一) ----java下常用的包功能
- php谈谈你对分布式的理解,简谈关于对分布式处理的理解
- python文件下载器代码_GitHub - applechi/pythonCollection: python代码集合(文件下载器、pdf合并、极客时间专栏下载、掘金小册下载、新浪微博爬虫等)...
- jsp 嵌入java_关于JSP里的Java语句嵌入问题
- [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名
- SQL中LIMIT子句介绍
- 分享最新十个流行的 jQuery 插件
- 6线AB相马达与ARDUINO 和 L298N电机之间
- 如何用 Python 翻译语言?
- 打造你的微信自动回复智障机器人
- 佛罗里达州立大学计算机专业排名,佛罗里达州立大学有哪些专业_专业排名(QS世界排名)...
- 数据结构c语言版李冬梅PDF,数据结构(C语言版) 习题答案 严蔚敏 李冬梅 吴伟民 23490数据结构习题答案.pdf...
- Flurry、友盟、TalkingData,Google analytic移动应用统计分析对比
- 输入一个QQ邮箱或者网易邮箱,判断其格式是否正确 要求:长度不能超过15,@前面不能用字母 正确格式2156636@qq.com
- xshell6 评估期已过 解决办法
- 【洛谷】P1456 Monkey King
- 你有用过 Github 的 Gist 吗?
- 如何做好数据分析报告(四)
- 三星计划降低存储芯片产能维持高价凸显它的垄断地位
热门文章
- 关于Jupyter Notebook默认起始目录设置无效的解决方法
- layer,一个可以让你想到即可做到的javascript弹窗(层)解决方案
- PHP输出中文乱码的解决方法
- 记一次用pip安装docker-compose报错及解决方法
- 为什么CSS使用假元素?
- 需要将git分支重置为原始版本
- DockerSwarm 微服务部署
- 2019年微服务实践第一课,网易谐云蘑菇街奥思技术大咖深度分享
- 应用中有使用到集群么?多大规模?
- 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...