详解Python的pyyaml模块

2023年1月15日09:58:39

一:什么是yaml

        yaml的英文名称是Yet Another Markup Language,直译过来就是标记语言。yaml用的比较多的地方就是写配置文件,比如yaml配置文件在Kubernetes用的就非常广泛,学Kubernetes必须要先学yaml文件格式。

        先简单的介绍一下yaml的基本语法:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样

 二:安装pyyaml

        pyyaml是python的第三方库,需要自己手动安装才能使用

pip install pyyaml

         本次安装的是pyyaml的6.0版本

 三:pyyaml的使用

 1,读取yaml文件

        先看看已经准备好的yaml文件

一级标题:
    二级标题1:
        b:1
        c:2
        a:3
    二级标题2:
        f:7
        t:8
        z:9

 用yaml的load方法来加载一个yaml文件流,返回的是一个json对象

import yaml


with open('./file.yaml', 'r', encoding='utf-8') as f:
	data = yaml.load(stream=f, Loader=yaml.FullLoader)
	print(data)

 运行结果如下:

 对于初学python的同学其实第一手资料最好查看模块对于自家方法以及属性的说明,怎么查看help呢,以上面的load方法为例,help('yaml.load')会显示出该方法的说明文档

root@ubuntu:~# python3
Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>>
>>> help('yaml.load')

 其说明文档如下:

 2,写入yaml文件

with open('./data_yaml.yaml', 'w', encoding='utf-8') as f:
	yaml.dump(data=data, stream=f, allow_unicode=True, sort_keys=False, indent=4)

其写入的文件如下:

3,dump_all的使用

        如果要将多个Python对象序列化到一个YAML流中,可以使用 yaml.dump_all 函数。该函数接受一个Python的列表或者生成器对象作为第一个参数,表示要序列化的多个Python对象

>>> obj = [{'name': 'bob', 'age': 19}, {'name': 20, 'age': 23}, {'name': 'leo', 'age': 25}]
>>> print(yaml.dump_all(obj))
{age: 19, name: bob}
--- {age: 23, name: 20}
--- {age: 25, name: leo}

   yaml.dump 和 yaml.dump_all 方法还支持多个关键字参数,用来指定生成的YAML流中YAML文档的样式和是否包含其他信息。下面就来详细介绍下每个参数的含义和用法

stream

指定由于输出YAML流的打开的文件对象。默认值为 None,表示作为函数的返回值返回。

default_flow_style

是否默认以流样式显示序列和映射。默认值为 None,表示对于不包含嵌套集合的YAML流使用流样式。设置为 True 时,序列和映射使用块样式。

default_style

默认值为 None。表示标量不使用引号包裹。设置为 '"' 时,表示所有标量均以双引号包裹。设置为 "'" 时,表示所有标量以单引号包裹。

canonical

是否以规范形式显示YAML文档。默认值为 None,表示以其他关键字参数设置的值进行格式化,而不使用规范形式。设置为 True 时,将以规范形式显示YAML文档中的内容。

indent

表示缩进级别。默认值为 None, 表示使用默认的缩进级别(两个空格),可以设置为其他整数。

width

表示每行的最大宽度。默认值为 None,表示使用默认的宽度80。

allow_unicode

是否允许YAML流中出现unicode字符。默认值为 False,会对unicode字符进行转义。设置为 True 时,YAML文档中将正常显示unicode字符,不会进行转义。

line_break

设置换行符。默认值为 None,表示换行符为 '',即空。可以设置为 \n、\r 或 \r\n。

encoding

使用指定的编码对YAML流进行编码,输出为字节字符串。默认值为 None,表示不进行编码,输出为一般字符串。

explicit_start

每个YAML文档是否包含显式的指令结束标记。默认值为 None,表示流中只有一个YAML文档时不包含显式的指令结束标记。设置为 True 时,YAML流中的所有YAML文档都包含一个显式的指令结束标记。

explicit_end

每个YAML文档是否包含显式的文档结束标记。默认值为 None,表示流中的YAML文档不包含显式的文档结束标记。设置为 True 时,YAML流中的所有YAML文档都包含一个显式的文档结束标记。

version

用于在YAML文档中指定YAML的版本号,默认值为 None,表示不在YAML中当中指定版本号。可以设置为一个包含两个元素的元组或者列表,但是第一个元素必须为1,否则会引发异常。当前可用的YAML的版本号为1.0、1.1 和1.2。

tags

用于指定YAML文档中要包含的标签。默认值为 None,表示不指定标签指令。可以设置为一个包含标签的字典,字典中的键值对对应各个不同的标签名和值。

4,其他方法和属性

pyyaml支持很多的对yaml文件以及yaml格式数据的操作

>>> dir(yaml)
['AliasEvent', 'AliasToken', 'AnchorToken', 'BaseDumper', 'BaseLoader', 'BlockEndToken', 'BlockEntryToken', 'BlockMappingStartToken', 'BlockSequenceStartToken', 
'CollectionEndEvent', 'CollectionNode', 'CollectionStartEvent', 'DirectiveToken', 'DocumentEndEvent', 'DocumentEndToken', 'DocumentStartEvent', 'DocumentStartToken',
 'Dumper', 'Event', 'FlowEntryToken', 'FlowMappingEndToken', 'FlowMappingStartToken', 'FlowSequenceEndToken', 'FlowSequenceStartToken', 'FullLoader', 'KeyToken', 
 'Loader', 'MappingEndEvent', 'MappingNode', 'MappingStartEvent', 'Mark', 'MarkedYAMLError', 'Node', 'NodeEvent', 'SafeDumper', 'SafeLoader', 'ScalarEvent', 
 'ScalarNode', 'ScalarToken', 'SequenceEndEvent', 'SequenceNode', 'SequenceStartEvent', 'StreamEndEvent', 'StreamEndToken', 'StreamStartEvent', 
 'StreamStartToken', 'TagToken', 'Token', 'UnsafeLoader', 'ValueToken', 'YAMLError', 'YAMLLoadWarning', 'YAMLObject', 'YAMLObjectMetaclass', 
 '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '__with_libyaml__',
 '_warnings_enabled', 'add_constructor', 'add_implicit_resolver', 'add_multi_constructor', 'add_multi_representer', 'add_path_resolver', 'add_representer',
 'compose', 'compose_all', 'composer', 'constructor', 'dump', 'dump_all', 'dumper', 'emit', 'emitter', 'error', 'events', 'full_load', 'full_load_all', 'io', 
 'load', 'load_all', 'load_warning', 'loader', 'nodes', 'parse', 'parser', 'reader', 'representer', 'resolver', 'safe_dump', 'safe_dump_all', 'safe_load', 
 'safe_load_all', 'scan', 'scanner', 'serialize', 'serialize_all', 'serializer', 'tokens', 'unsafe_load', 'unsafe_load_all', 'warnings']
 
 

  • 作者:ftzchina
  • 原文链接:https://blog.csdn.net/qq_27071221/article/details/125455767
    更新时间:2023年1月15日09:58:39 ,共 4039 字。