一、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模块的使用相关推荐

  1. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. python中模块和函数_Python中函数和模块的体验与使用

    函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...

  4. python中导入模块的方式_Python中几种导入模块的方式总结

    模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入.常见的方式有如下几种: 1 . import >>> import sys >>> sys.path ...

  5. python中path语句什么意思_python中jsonpath模块有何用法?

    小编做项目的时候,遇到一个问题,虽然解决了,但是也是深入的思考的一番,遇到问题是这样的,我们返回的基本格式都是json,但是json都是层层递进的,如果想审核json中心找到字符串等内容,要一层一层的 ...

  6. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  7. python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...

    一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...

  8. python中导入模块有哪些_python有三种导入模块的方法

    原博文 2011-05-24 10:54 − python有三种导入模块的方法 其一, import modname : 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了 ...

  9. python sys模块 argv用法_python中sys模块的argv

    """笨办法学python,启动时在命令行中python 脚本文件名 filename"""from sys import argv# ar ...

最新文章

  1. Spring的PropertyPlaceholderConfigurer事例应用
  2. java学习笔记(一) ----java下常用的包功能
  3. php谈谈你对分布式的理解,简谈关于对分布式处理的理解
  4. python文件下载器代码_GitHub - applechi/pythonCollection: python代码集合(文件下载器、pdf合并、极客时间专栏下载、掘金小册下载、新浪微博爬虫等)...
  5. jsp 嵌入java_关于JSP里的Java语句嵌入问题
  6. [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名
  7. SQL中LIMIT子句介绍
  8. 分享最新十个流行的 jQuery 插件
  9. 6线AB相马达与ARDUINO 和 L298N电机之间
  10. 如何用 Python 翻译语言?
  11. 打造你的微信自动回复智障机器人
  12. 佛罗里达州立大学计算机专业排名,佛罗里达州立大学有哪些专业_专业排名(QS世界排名)...
  13. 数据结构c语言版李冬梅PDF,数据结构(C语言版) 习题答案 严蔚敏 李冬梅 吴伟民 23490数据结构习题答案.pdf...
  14. Flurry、友盟、TalkingData,Google analytic移动应用统计分析对比
  15. 输入一个QQ邮箱或者网易邮箱,判断其格式是否正确 要求:长度不能超过15,@前面不能用字母 正确格式2156636@qq.com
  16. xshell6 评估期已过 解决办法
  17. 【洛谷】P1456 Monkey King
  18. 你有用过 Github 的 Gist 吗?
  19. 如何做好数据分析报告(四)
  20. 三星计划降低存储芯片产能维持高价凸显它的垄断地位

热门文章

  1. 关于Jupyter Notebook默认起始目录设置无效的解决方法
  2. layer,一个可以让你想到即可做到的javascript弹窗(层)解决方案
  3. PHP输出中文乱码的解决方法
  4. 记一次用pip安装docker-compose报错及解决方法
  5. 为什么CSS使用假元素?
  6. 需要将git分支重置为原始版本
  7. DockerSwarm 微服务部署
  8. 2019年微服务实践第一课,网易谐云蘑菇街奥思技术大咖深度分享
  9. 应用中有使用到集群么?多大规模?
  10. 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...