详解Python中Pyyaml模块的使用

 更新时间:2020年10月08日 10:49:18   作者:蜀山客e  
这篇文章主要介绍了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中Pyyaml模块的使用的文章就介绍到这了,更多相关Python中Pyyaml模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)

    10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)

    这篇文章主要介绍了10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招),目前在国内通过手机短信保障信息安全是比较常见的,具体实例代码大家跟随小编一起通过本文学习吧
    2018-10-10
  • python提取word文件中的所有图片

    python提取word文件中的所有图片

    办公中,偶尔会碰到一种情况,需要提取word文档中的图片,决定写这样一款工具自动提取图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Python+NumPy绘制常见曲线的方法详解

    Python+NumPy绘制常见曲线的方法详解

    NumPy(Numerical Python)是Python的一种开源的数值计算扩展。本文将利用NumPy库绘制利萨茹曲线、计算斐波那契数列、方波和锯齿波和三角波,需要的可以参考一下
    2022-06-06
  • pycharm引入其他目录的包报错,import报错的解决

    pycharm引入其他目录的包报错,import报错的解决

    这篇文章主要介绍了pycharm引入其他目录的包报错,import报错的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴

    np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴

    今天小编就为大家分享一篇np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • pytorch ssim计算详细代码例子

    pytorch ssim计算详细代码例子

    这篇文章主要给大家介绍了关于pytorch ssim计算的相关资料,结构相似性(SSIM)是一种测量两幅图像的相似度的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • python实现CTC以及案例讲解

    python实现CTC以及案例讲解

    这篇文章主要介绍了python实现CTC以及案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Python趣味挑战之turtle库绘画飘落的银杏树

    Python趣味挑战之turtle库绘画飘落的银杏树

    银杏还是和恐龙同时代的植物,被称为活化石,适应能力强,生长期漫长,寿命可达千年.因此,银杏是长寿的代表和象征,接下来用Python的turtle库来绘画银杏树唯美的一幕,需要的朋友可以参考下
    2021-05-05
  • 配置jupyter notebook全步骤,更改默认路径,jupyter不是问题

    配置jupyter notebook全步骤,更改默认路径,jupyter不是问题

    这篇文章主要介绍了配置jupyter notebook全步骤,更改默认路径,jupyter不是问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 学好python基本数据类型

    学好python基本数据类型

    这篇文章主要介绍了学好python基本数据类型,学习python基本数据类型我们需要了解基本数据类型有数字int、布尔值bool、字符串str、列表list、元组tuple、字典dict等,其中包括他们的基本用法和其常用的方法,下面来看看文章的具体介绍吧
    2021-12-12

最新评论