JB的Python之旅-yaml介绍

前言

在用gitlab ci的时候,会用到yml文件配置,但是yml到底是啥?一点印象都没有,所以想学习了解下~

目的

学习yaml语法,以及在python里面怎么使用

yaml

yaml这个词是JB第一次接触,就是在折腾gitlab ci时,需要处理.gitlab-ci.yml文件,从而接触到yaml;
一开始以为是类php的玩意,结果发现有些写法对不上,那导致,什么是yaml?它是干嘛的?

官网链接:http://yaml.org/

官网里面有句话:

不是标记语言,是表达数据序列语言;
换个角度看, YAML 是专门用来写配置文件的语言
据说非常简洁和强大,远比 JSON、xml等 格式方便。

简介

YAML 语言设计目标,就是方便人类读写;
它实质上是一种通用的数据串行化格式;
以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读;
它的基本语法规则如下:

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

三种数据结构

1)对象
键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map

# YAML表示
age : 18
name : jb

或者写成一行:
# YAML表示
{age:12,name:huang}

# 对应的Json表示
{'age':18,'name':'jb'}
复制代码

2)list,数组
一组连词线(-)开头的行,构成一个数组

# YAML表示
- a
- b
- 12

或者写成一行:
# YAML表示
[a,b,c]

# 对应Json表示
['a','b',12]
复制代码

3)scalar,纯量
数据最小的单位,不可以再分割
比如数值型,字符串,日期,字符串等;

数据结构嵌套

1)map嵌套map

# YAML表示
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 

# 对应Json表示
{ websites: 
   { YAML: 'yaml.org',
     Ruby: 'ruby-lang.org',
     Python: 'python.org',
     Perl: 'use.perl.org' } }
复制代码

2)map嵌套list

# YAML表示
languages:
 - Ruby
 - Perl
 - Python 
 - c

# 对应Json表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }
复制代码

3)list嵌套list

# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java

# 对应Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]
复制代码

除此之外,还可以下面这样显示:

# 方法2
- - Ruby
  - Perl
  - Python 
- - c
  - c++
  - java

# 方法3
- [Ruby,Perl,Python]
- [c,c++,java]
复制代码

4)list嵌套map

# YAML表示
-
  id: 1
  name: huang
-
  id: 2
  name: liao

# 对应Json表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]
复制代码

安装yaml模块

pip install pyyaml
复制代码

编写yaml文件

安装成功后,那就手动新建一个yaml文件吧:

name: jb
age: 18
spouse:
    name: jb2
    age: 19
children:
    - name: jb3
      age: 1
    - name: jb4
      age: 2
复制代码

如果要修改其中的内容,怎么处理?看个例子就明白了;

import yaml

f = open("jb.yaml")
content = yaml.load(f)
#上面2步时读取yml文件

print("修改前:"+str(content))
content["age"] = 17
content["children"][1]["age"] = 18
print("修改后:"+str(content))

执行的结果:
修改前:{'name': 'jb', 'age': 18, 'spouse': {'name': 'jb2', 'age': 19}, 'children': [{'name': 'jb3', 'age': 1}, {'name': 'jb4', 'age': 2}]}
修改后:{'name': 'jb', 'age': 17, 'spouse': {'name': 'jb2', 'age': 19}, 'children': [{'name': 'jb3', 'age': 1}, {'name': 'jb4', 'age': 18}]}
复制代码

这里面介绍了load方法,返回一个对象;

那如果有几块yaml文档,可以用load_all()处理,生成的时一个迭代器:

数据修改成:

name: jb
---
age: 18
spouse:
    name: jb2
    age: 19
children:
    - name: jb3
      age: 1
    - name: jb4
      age: 2
      
      
代码如下:
import yaml

f = open("jb.yaml")
content = yaml.load_all(f)

for i in content:
    print(i)

输出的结果:
'name': 'jb'}
{'age': 18, 'spouse': {'name': 'jb2', 'age': 19}, 'children': [{'name': 'jb3', 'age': 1}, {'name': 'jb4', 'age': 2}]}
复制代码

dump,将一个python对象生成为yaml文档

import yaml
aproject = {'name': 'jb',
            'race': 'jb',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }

print(yaml.dump(aproject,))

执行的结果:
name: jb
race: jb
traits: [ONE_HAND, ONE_EYE]
复制代码

dump接收的第二个参数一定要是一个打开的文本文件或二进制文件,
yaml.dump会把生成的yaml文档写到文件里

import yaml

aproject = {'name': 'jb',
            'race': 'jb',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }
f = open(r'C:\Users\jb\gitprojects\jbtest\jb.yaml','w')
print(yaml.dump(aproject,f))
复制代码

这样就能把所需要的内容落地到文件~

dump_all,将多个段输出到要给文件中
上面的例子是一个段,如果有多个段,要怎么落地文件呢?
这时候,就可以用dump_all了;

import yaml

obj1 = {"name": "jb", "age": 2}
obj2 = ["jb2", 3]

f = open(r'C:\Users\jb\gitprojects\jbtest\jb.yaml','w')
print(yaml.dump([obj1,obj2],f))
复制代码

输出的结果:

yaml、xml、json

关于yaml基本用法就这几个,不打算再深入了解,只想起到扫盲效果即可;

换个话题,yaml的介绍是说,比xml跟json都好用,那我们一起看看,怎么好用~
1)yaml跟xml
以下为同一内容,分别用xml跟yaml表示

# xml标记两个site
<site>
    <name>sina</name>
    <url>http://www.361way.com</url>
</site>
<site>
    <name>google</name>
    <url>http://www.91it.org</url>
</site>
# 使用yaml标记两个site
---
site:
    name: sina
    url : http://www.361way.com
---
site:
    name: google
    url : http://www.91it.org
# 使用yaml标记两个site
---
site: {name: sina, url: http://www.361way.com}
---
site: {name: google, url: http://www.91it.org}
复制代码

从查看信息的角度,yaml感觉直观多了~

2)yaml跟json
yaml跟json是非常相似的,并没有xml那样可以只管看出,而python提供方法在两者之间转换;

yaml到json

import yaml,json
yml = """
---
  foo: bar
"""
data = yaml.load(yml)
json = json.dumps(data)
print(json)
复制代码

输出的结果:

{"foo": "bar"}
复制代码

json转yaml:

import json,yaml
str = '{ "foo": "bar" }'
data = json.loads(str)
yml = yaml.safe_dump(data)
print(yml)
复制代码

输出的结果:

{foo: bar}
复制代码

其实json跟yaml的差别不是很大的~

小结

本文主要介绍了yaml是什么东东,并且与xml的区别,介绍了load、load_all、dump、duml_all方法的使用,大致就这样吧,扫盲专用~

谢谢大家~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值