yaml的英文名称是Yet Another Markup Language,直译过来就是标记语言。yaml用的比较多的地方就是写配置文件,比如yaml配置文件在Kubernetes用的就非常广泛,学Kubernetes必须要先学yaml文件格式。
先简单的介绍一下yaml的基本语法:
pyyaml是python的第三方库,需要自己手动安装才能使用
pip install pyyaml
本次安装的是pyyaml的6.0版本
先看看已经准备好的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')
其说明文档如下:
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)
其写入的文件如下:
如果要将多个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,表示不指定标签指令。可以设置为一个包含标签的字典,字典中的键值对对应各个不同的标签名和值。
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']