配置文件语言之yaml

Posted victorm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置文件语言之yaml相关的知识,希望对你有一定的参考价值。

一. Yaml

YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,phpjavascript等。

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。比如同一段数据Josn和Yaml的表示分别如下:

Json
{ name: ‘Tom Smith‘,age: 37,spouse: { name: ‘Jane Smith‘, age: 25 },children: [ { name: ‘Jimmy Smith‘, age: 15 },{ name: ‘Jenny Smith‘, age: 12 } ] }
yaml

name: Tom Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
 - name: Jimmy Smith
   age: 15
 - name: Jenny Smith
   age: 12

清晰明了程度一下子就看出来了吧。

语法特点

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

yaml下载安装

pip install yaml

yaml数据类型详解

支持数据类型

  1. 纯量(scalars):单个的、不可再分的值
  2. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  3. 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

纯量

数据最小的单位,不可以再分割。类似于Python中单个变量

flag

list数组

与Python的list数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。

- Jack
- Harry
- Sunny
 
# 也可以写成一行
[Jack,Harry,Sunny]

对应到python的list写法如下:

[Jack,Harry,Sunny]

对象

对象的一组键值对,使用冒号结构表示。类似Python中的字典数据结构。

platformName: android
platformVersion: 6.0.1

# Yaml 也允许另一种写法,将所有键值对写成一个行内对象。
{platformName: Android,platformVersion: 6.0.1}
注意:冒号后面一定要有空格!对应到python字典的写法如下:
{platformName: Android, platformVersion: 6.0.1}

数据嵌套

yaml数据嵌套表示可以将上面的各类数据根据实际场景进行组合嵌套。

数据场景

Tom Smith 37岁,他有一个妻子叫 Jane Smith,25岁。 另外他有2个孩子,一个叫Jimmy Smith,15岁;另外一个叫Jenny Smith ,12岁。

yaml语法表示如下:

技术分享图片
name: Tom Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
 - name: Jimmy Smith
   age: 15
 - name: Jenny Smith
   age: 12
familyInfo.yaml

转化为Python的写法为:

{name:Tom Smith,age:37,spouse:{name:Jane Smith,age:25},childern:[{name:Jimmy Smith,age:15},{name:Jenny Smith,age:12}]}

yaml数据操作

数据读取:load()方法

load(stream, Loader=Loader) 解析文件流中的第一个YAML文档并生成相应的Python对象。

代码实现
技术分享图片
# 读取familyinfo.yaml文件的数据
import yaml

file = open(familyinfo.yaml, r)
data = yaml.load(file)

# 打印全量data数据
print(data)

# 获取配偶信息
print(data[spouse])

# 分别获取配偶的姓名和年龄
print(data[spouse][name])
print(data[spouse][age])

# 获取所有孩子的信息
print(data[children])

# 分别获取每个孩子的信息
print(data[children][0])
print(data[children][0][name])
print(data[children][0][age])

print(data[children][1])
print(data[children][1][name])
print(data[children][1][age])

# 修改Tom Smith的名字,但是不写入yaml文件
data[name] = Ma Mingchen
print(data[name])

# 修改第一个孩子的名字
data[children][0][name]=Ma Yuhe
print(data[children][0][name])
yaml_load.py

数据转化

方法:dump()可以将Python对象序列化成YAML流。如果stream为None,则返回生成的字符串。

将下面python数据类型转化为yaml数据类型

slogan=[welcome,to,BeiJing]
website={url:www.baidu.com}
代码实现
技术分享图片
import yaml


# 将下面python数据类型转化为yaml数据类型
slogan=[welcome,to,BeiJing]
website={url:www.baidu.com}

print(slogan)
print(website)

# 将python数据类型转换为yaml流
print(yaml.dump(slogan))
print(yaml.dump(website))
yaml_dump.py

 

 

以上是关于配置文件语言之yaml的主要内容,如果未能解决你的问题,请参考以下文章

python之yaml文件读取

python之yaml文件读取

SaltStack实战之配置管理-YAML编写技巧

SaltStack之配置管理

SaltStack之配置管理

SpringBoot入门之分散配置