YAML介绍和使用

YAML介绍

YAML是”YAML Ain’t markup language"(YAML不是一种标记语言)的缩写,是一种对人类设计友好(方便读写)的数据序列化语言,可以很好地与其它编程语言协同完成日常任务。
它是JSON的一个严格超集,在语法上增加了类似Python的换行和缩进。不过,与Python不同,YAML不允许使用Tab缩进。

  • 基本规则

YAML有一些基本的规则,用来避免与各种编程语言和编辑器相关的歧义问题,这些基本的规则使得无论哪个应用程序或软件库都能一致地解析YAML。
1.文件名以.yaml结尾
2.大小写敏感
3.不允许使用Tab。由于Tab的支持性不够普通,因此使用空格。

  • 基本数据类型

YAML的基本数据类型与JSON一致,字符串、数字等标量类型,List、Map等容器类型。
YAML擅长处理映射表(哈希表 / 字典)、序列(数组 / 列表)和标量(字符串 / 数字)。

YAML使用

  • 标量
    最基础的数据类型,包括布尔值、数字、字符串。
integer: 25
string: "25"
float: 25.0
boolean: Yes
  • 序列
    列表或者数组。每个item一行,以-开头。
- Cat
- Dog
- Goldfish

同一层级的item是一个序列,可以用缩进来表示多层的序列。

  - Cat
  - Dog
  - Goldfish
-
  - Python
  - Lion
  - Tiger

可以是多层的:

-
 -
  - Cat
  - Dog
  - Goldfish

也可以这么写:

--- Cat
 - Dog
 - Goldfish
  • 映射表
    键值对,如:
animal: pets

如果值是一个序列:

pets:
  - Cat
  - Dog
  - Goldfish

5分钟教程

--- # 文档开头

# YAML注释类似这样

################
#    标量类型   #
################

# 根对象是一个map,相当于其它语言中的dictionary、hash或者object。
key: value
another_key: Another value goes here.
a_number_value: 100
scientific_notation: 1e+12

# 数字1会被解析为数值类型,而不是布尔类型。如果希望被解析为布尔类型,请使用`true`
boolean: true
null_value: null
key with spaces: value

# 字符串不需要使用引号,不过可以使用。
however: 'A string, enclosed in quotes.'
'Keys can be quoted too.': "Useful if you want to put a ':' in your key."
single quotes: 'have ''one'' escape pattern'
double quotes: "have many: \", \0, \t, \u263A, \x0d\x0a == \r\n, and more."
# UTF-8/16/32的字符需要编码
Superscript two: \u00B2

# 多行字符串可以写作"literal block"(用'|')或者"folded block"(用'>')
literal_block: |
    整块文本都是'literal_block'的值,换行会被保留。

    只要缩进的文本都包含在block中,首缩进会被去除。
    
        多余的缩进会被保留 - 此行文字会缩进4个空格。
        
folded_style: >
    整块文本都是`folded_style`的值,不过所有的换行会被替换为一个。
    
    上面的空行会被转换为一个换行符。
    
        多余的缩进依然会保留其换行 -
        此段文字会展示为两行。
        
####################
#      容器类型     #
####################

# 嵌套使用缩进。推荐使用2个空格的缩进(但不是必须的)。
a_nested_map:
  key: value
  another_key: Another Value
  another_nested_map:
    hello: hello
    
# Map的key可以是非字符串
0.25: a float key

# Key可以是复杂对象,像多行对象一样,我们使用问号后跟一个空格来表示复杂Key的开始。
? |
  This is a key
  that has multiple lines
: and this is its value

# YAML还允许使用复杂Key语法在序列之间进行映射
# 某些语言的解析器可能会有警告
? - Manchester United
  - Real Madrid
: [2001-01-01, 2002-02-02]

# 序列(List、Array等)这样表示
# (注意,'-'算作缩进)
a_sequence:
  - Item 1
  - Item 2
  - 0.5  # 序列可以包含不同的类型
  - Item 4
  - key: value
    another_key: another_value
  -
    - This is a sequence
    - inside another sequence
  - - - Nested sequence indicators
      - can be collapsed
      
# YAML是JSON的严格超集,因此可以使用JSON风格的map和序列
json_map: {"key": "value"}
json_seq: [3, 2, 1, "takeoff"]
and quotes are optional: {key: [3, 2, 1, takeoff]}

#######################
#    YAML的额外特性    #
#######################

# YAML有一个方便特性“anchor",可以方便地在文档中重复内容。以下两个key对应的值相同:
anchored_content: &anchor_name This string will appear as the value of two keys.
other_anchor: *anchor_name

# Anchor可以用来重复/继承属性
base: &base
  name: Everyone has same name

# 正则表达式 << 称作Merge Key Language-Independent Type,
# 表示将一个或多个map的所有key插入到当前map

foo: &foo
  <<: *base
  age: 10

bar: &bar
  <<: *base
  age: 20

# foo和bar都会包含name: Everyone has same name

# YAML还支持tag,用来显式地声明类型。
explicit_string: !!str 0.5 # 指明字符串类型
# 某些解析器实现了语言相关的tag,比如Python的复杂数值类型
python_complex_number: !!python/complex 1+2j

# 语言相关的tag可以与复杂key一起使用
? !!python/tuple [5, 7]
: Fifty Seven
# 在Python中值为{(5, 7): 'Fifty Seven'}

####################
#   YAML的额外类型  #
####################

# YAML不仅可以理解字符串和数字这样的基本类型,
# 也可以理解ISO格式的日期和时间字面量。
datetime: 2001-12-15T02:59:43.1Z
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

# !!binary这个tag表示一个base64编码的二进制对象
gif_file: !!binary |
  R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
  OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
  +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
  AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=

# YAML也支持集合类型:
set:
  ? item1
  ? item2
  ? item3
or: {item1, item2, item3}

# 集合其实是值为null的map;上面的写法等同于:
set2:
  item1: null
  item2: null
  item3: null

...  # 文档结尾

下面是使用python对yaml做了一个简单的解析处理

user.yaml

init_user:
- user: isddc-api
  password: 'PXMv1?Ts'
  project: service
  role: service_oi_edge

- user: cmo
  password: '@j9lja6w'
  group: service

test_yaml.py

import json
import yaml

def func():
    with open('user.yaml', 'rt', encoding='utf-8') as f:
        data = f.read()
        data = yaml.load(data)
        # print(json.dumps(data))
        for i in data['init_user']:
            if 'role' in i:
                print(666)
                print(type(i['password']))
            elif 'group' in i:
                print(333)

func()
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值