yaml文件解析詳解

前言

yaml文件是什麼?yaml文件其實也是一種配置文件類型,相比較ini,conf配置文件來說,更加的簡潔,操作也更加簡單,同時可以存放不同類型的數據,不會改變原有數據類型,所有的數據類型在讀取時都會原樣輸出,yaml文件依賴python的第三方庫PyYaml模塊

PyYaml安裝

yaml文件處理需要藉助python的第三方庫,因此我們第一步需要安裝

打開CMD執行命令: pip install PyYaml  注意:不要把Yaml寫成Ymal

讀yaml文件

yaml存字典並讀取

config.yaml

cnblog: linux超
address: BeiJing
Company: petrochina
age: 18
now: 8.14
empty1: null
empty2: ~

parseyaml.py

"""
------------------------------------
@Time : 2019/8/14 20:37
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml


with open("config.yml", "r", encoding="utf8") as f:
    context = yaml.load(f, Loader=yaml.FullLoader)
print("讀取內容", context, type(context))
print(context["cnblog"], type(context["cnblog"]))
print(context["age"], type(context["age"]))
print(context["now"], type(context["now"]))
print(context["empty1"], type(context["empty1"]))

輸出

讀取內容 {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'>
linux超 <class 'str'>
18 <class 'int'>
8.14 <class 'float'>
None <class 'NoneType'>

Process finished with exit code 0

從輸出結果及yaml文件內容你可以看到,當前輸出的內容是一個字典類型,yaml文件中存儲的字符串輸出仍是字符串類型,int型仍是int型等,存儲None類型可以使用null,~符號以及None,這也是區別ini配置文件的地方,且文件內容使用[key:value]的形式定義,當然key和value也可以使用雙引號修飾;上面的yaml文件只存儲了一組數據,你也可以存放多組數據,看下面的實例

yaml存多組數據並讀取

config.yaml

cnblog: linux超
address: BeiJing
Company: petrochina
age: 18
now: 8.14
---
name: linux超
gender: 男

parseyaml.py

"""
------------------------------------
@Time : 2019/8/14 20:37
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml


with open("config.yml", "r", encoding="utf8") as f:
    context = yaml.load_all(f, Loader=yaml.FullLoader)
    print(context)
    for i in context:
        print(i)

輸出

我是一個生成器 <generator object load_all at 0x01DDDAB0>
{'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14}
{'name': 'linux超', 'gender': ''}

Process finished with exit code 0

通過輸出結果及yaml存儲內容可以看出,當yaml文件存儲多組數據在一個yaml文件中時,需要使用3個橫杆分割,讀取數據時需要使用load_all方法,而且此方法返回一個生成器,需要使用for循環迭代讀取每一組數據下面再看一下yaml如何存儲列表類型數據

yaml存儲列表並讀取

config.yaml

- linux超
- BeiJing
- petrochina
- 18
- 8.14

parseyaml.py

"""
------------------------------------
@Time : 2019/8/14 20:37
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml


with open("config.yml", "r", encoding="utf8") as f:
    context = yaml.load(f, Loader=yaml.FullLoader)
print("讀取內容", context, type(context))

輸出

讀取內容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'>

Process finished with exit code 0

當yaml文件存儲列表數據時,需要使用一個橫槓[- 元素]表示爲列表的一個元素,除了列表以外還可以存儲元組,或者說支持強制類型轉換

yaml存儲元組並讀取

config.yml

--- !!python/tuple # 列表轉成元組
- 1
- 2
- 3
---
age: !!str 18 # int 類型轉換爲str

 parseyaml.py

"""
------------------------------------
@Time : 2019/8/14 19:46
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml

with open("./config.yml", "r", encoding="utf-8") as f:
    context = yaml.load_all(f, Loader=yaml.FullLoader)
    for i in context:
        print(i)

輸出

(1, 2, 3)
{'age': '18'}

Process finished with exit code 0

yaml文件使用兩個!!號可以對數據進行類型轉換,但是在我看來感覺沒有用,當然可能我沒遇見過需要做類型轉化的情況;你還可以像下面這樣存放更加複雜的數據,比如字典嵌套字典及列表

config.yaml

info:
  - user:
      username: linux超
      password: linuxxiaochao
company:
  first: petrochina
  second: lemon teacher

parseyaml.py

"""
------------------------------------
@Time : 2019/8/14 20:37
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml


with open("config.yml", "r", encoding="utf8") as f:
    context = yaml.load(f, Loader=yaml.FullLoader)
print("讀取內容\n", context, type(context))

輸出

讀取內容
 {'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <class 'dict'>

Process finished with exit code 0

小結

實際工作中大概就是存儲字典,列表,或者相互嵌套的數據較常見,那麼在存儲和讀取時需要掌握以下幾點

1.存儲字典時,以[key:value]的形式定義

2.存儲列表時,需要使用[- 元素]表示列表

3.存儲多組數據時,需要每組數據之間使用3個橫槓-分割分割

4.數據嵌套時,需要注意縮進,和編寫python代碼的縮進規則相同,唯一不同是,yaml中的縮進只要統一即可不需要指定縮進多少

5.讀取一組數據時,直接使用load(stream, loader)方法, 讀取多組數據時需要使用load_all(stream, loader)方法,此方法返回的是一個生成器,需要使用for循環讀取每一組數據,還需要注意兩個方法中的最好像我代碼中一樣傳遞loader參數爲FullLoader,否則會報Warnning

寫yaml文件

向yaml文件中寫數據就比較簡單了,直接使用dump方法和dump_all方法即可,無論多複雜的數據都可以直接寫入,看實例

dump寫入一組數據

"""
------------------------------------
@Time : 2019/8/14 19:46
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml

response = {
    "status": 1,
    "code": "1001",
    "data": [
        {
            "id": 80,
            "regname": "toml",
            "pwd": "QW&@JBK!#&#($*@HLNN",
            "mobilephone": "13691579846",
            "leavemount": "0.00",
            "type": "1",
            "regtime": "2019-08-14 20:24:45.0"
        },
        {
            "id": 81,
            "regname": "toml",
            "pwd": "QW&@JBK!#&#($*@HLNN",
            "mobilephone": "13691579846",
            "leavemount": "0.00",
            "type": "1",
            "regtime": "2019-08-14 20:24:45.0"
        }
    ],
    "msg": "獲取用戶列表成功"
}

try:
    with open("./config.yml", "w", encoding="utf-8") as f:
        yaml.dump(data=response, stream=f, allow_unicode=True)
except Exception as e:
    print("寫入yaml文件內容失敗")
    raise e
else:
    print("寫入yaml文件內容成功")

生成的yaml文件內容

code: '1001'
data:
- id: 80
  leavemount: '0.00'
  mobilephone: '13691579846'
  pwd: QW&@JBK!#&#($*@HLNN
  regname: toml
  regtime: '2019-08-14 20:24:45.0'
  type: '1'
- id: 81
  leavemount: '0.00'
  mobilephone: '13691579846'
  pwd: QW&@JBK!#&#($*@HLNN
  regname: toml
  regtime: '2019-08-14 20:24:45.0'
  type: '1'
msg: 獲取用戶列表成功
status: 1

dump_all寫入多組數據

"""
------------------------------------
@Time : 2019/8/14 19:46
@Auth : linux超
@File : parseYaml.py
@IDE  : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ   : [email protected]
@GROUP: 878565760
------------------------------------
"""
import yaml

response = {
    "status": 1,
    "code": "1001",
    "data": [
        {
            "id": 80,
            "regname": "toml",
            "pwd": "QW&@JBK!#&#($*@HLNN",
            "mobilephone": "13691579846",
            "leavemount": "0.00",
            "type": "1",
            "regtime": "2019-08-14 20:24:45.0"
        },
        {
            "id": 81,
            "regname": "toml",
            "pwd": "QW&@JBK!#&#($*@HLNN",
            "mobilephone": "13691579846",
            "leavemount": "0.00",
            "type": "1",
            "regtime": "2019-08-14 20:24:45.0"
        }
    ],
    "msg": "獲取用戶列表成功"
}

info = {
    "name": "linux超",
    "age": 18
}

try:
    with open("./config.yml", "w", encoding="utf-8") as f:
        yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True)
except Exception as e:
    print("寫入yaml文件內容失敗")
    raise e
else:
    print("寫入yaml文件內容成功")

生成的yaml文件內容

code: '1001'
data:
- id: 80
  leavemount: '0.00'
  mobilephone: '13691579846'
  pwd: QW&@JBK!#&#($*@HLNN
  regname: toml
  regtime: '2019-08-14 20:24:45.0'
  type: '1'
- id: 81
  leavemount: '0.00'
  mobilephone: '13691579846'
  pwd: QW&@JBK!#&#($*@HLNN
  regname: toml
  regtime: '2019-08-14 20:24:45.0'
  type: '1'
msg: 獲取用戶列表成功
status: 1
---
age: 18
name: linux超

小結

1.寫入一組數據直接使用dump方法或者dump_all方法也可

2.寫入多組數據只能使用dump_all方法

3.寫入數據時最重要的一點需要注意:如果你的數據包含中文,dump和dump_all 方法需要添加allow_unicode=True參數,否則中文寫入後不會正常顯示

總結

1.yaml存儲數據規則-多組數據使用---分割,數據嵌套時注意縮進,存儲字典使用[key: value]的形式,存儲列表使用[- 元素]的形式,使用load讀一組數據,使用load_all 可以讀多組數據

2.yaml文件寫入一組數據直接使用dump方法,寫入多組數據使用dump_all方法,注意寫入數據帶中文,需要指定參數allow_unicode=True

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章