在用gitlab ci的时候,会用到yml文件配置,可是yml究竟是啥?一点印象都没有,因此想学习了解下~php
学习yaml语法,以及在python里面怎么使用java
yaml这个词是JB第一次接触,就是在折腾gitlab ci时,须要处理.gitlab-ci.yml文件,从而接触到yaml;
一开始觉得是类php的玩意,结果发现有些写法对不上,那致使,什么是yaml?它是干吗的?python
官网连接:http://yaml.org/c++
官网里面有句话:git
YAML 语言设计目标,就是方便人类读写;
它实质上是一种通用的数据串行化格式;
以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读;
它的基本语法规则以下:web
1)对象
键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
使用冒号(:)表示键值对,同一缩进的全部键值对属于一个map
json
# 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,纯量
数据最小的单位,不能够再分割
好比数值型,字符串,日期,字符串等;ruby
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' } ]
复制代码
pip install pyyaml
复制代码
安装成功后,那就手动新建一个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基本用法就这几个,不打算再深刻了解,只想起到扫盲效果便可;
换个话题,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方法的使用,大体就这样吧,扫盲专用~
谢谢你们~