在用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方法的使用,大體就這樣吧,掃盲專用~
謝謝你們~