JB的Python之旅-yaml介紹

前言

在用gitlab ci的時候,會用到yml文件配置,可是yml究竟是啥?一點印象都沒有,因此想學習瞭解下~php

目的

學習yaml語法,以及在python裏面怎麼使用java

yaml

yaml這個詞是JB第一次接觸,就是在折騰gitlab ci時,須要處理.gitlab-ci.yml文件,從而接觸到yaml;
一開始覺得是類php的玩意,結果發現有些寫法對不上,那致使,什麼是yaml?它是幹嗎的?python

官網連接:http://yaml.org/c++

官網裏面有句話:git

不是標記語言,是表達數據序列語言;
換個角度看, YAML 是專門用來寫配置文件的語言
聽說很是簡潔和強大,遠比 JSON、xml等 格式方便。

簡介

YAML 語言設計目標,就是方便人類讀寫;
它實質上是一種通用的數據串行化格式;
以數據爲中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀;
它的基本語法規則以下:web

  • 大小寫敏感
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tab鍵,只容許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可
  • 使用#表示註釋,從這個字符一直到行尾,都會被解析器忽略。
  • 字符串能夠不用引號標註

三種數據結構

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' } ]
複製代碼

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

謝謝你們~

相關文章
相關標籤/搜索