首頁 > 軟體

Python學習之yaml檔案的讀取詳解

2022-03-28 16:01:24

yaml 檔案的應用場景與格式介紹

yaml 檔案的應用場景

yaml其實也類似於 json、txt ,它們都屬於一種文字格式。在我們的實際工作中, yaml 檔案經常作為服務期組態檔來使用。 比如一些定義好的內容,並且不會修改的資訊,我們就可以通過定義 yaml 檔案,然後通過讀取這樣的檔案,將資料匯入到我們的服務中進行使用。

由於 yaml 檔案一般作為組態檔使用,所以較少會修改。故而該章節,我們僅學習 yaml 檔案的讀取。

yaml 檔案的格式

==首先大家需要知道,yaml 不是標示語言,跟 json 類似,yaml 的用途也是對資料進行序列化。(內容格式為鍵值對,但是與 dict 資料型別的鍵值對顯示的樣式有所區別)。內容格式人性化,較易讀.==yaml 檔案格式字尾為 .yaml。

注意:YAML 有一個小的怪癖。所有的 YAML 檔案開始行都應該是 —。這是 YAML 格式的一部分, 表明一個檔案的開始。>

YAML語法格式如下:

1、大小寫敏感

2、使用縮排表示層級關係

3、縮排的空格數目不重要,只要相同層級的元素左側對齊即可,通常開頭縮排兩個空格

4、不支援Tab鍵製表符縮排,只使用空格縮排

5、字元后縮排一個空格,如冒號,逗號,短橫杆(-)等

6、"—“表示YAML格式,一個檔案的開始,用於分隔檔案間

7、”#”表示註釋 (yaml檔案只有行註釋)

YAML 支援的資料結構有三種。

物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)

陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)

純量(scalars):單個的、不可再分的值

下面對這三種資料結構做詳細介紹:

yaml 中的值有以下基本型別:

  • 字串
  • 整形
  • 浮點型
  • 布林型
  • null
  • 時間
  • 日期

yaml 檔案內容格式範例如下:

# 註釋

# 1-1、字典  鍵: 值
username: xiaoming  # 冒號後面是空格
password: 123456
info: 設定  # 中文---不建議使用,有可能會亂碼

# 1-2、字典巢狀
NAME_PSW:
  name:xiaoming
  password:123456


# 2-1、列表格式
-10
-20
-30

# 2-2、列表巢狀
-10
-20
-
 -100
 -200


# 3-1、列表中套字典
-10
-20
-
 name: tom
 password: 123456


# 4-1、字典套列表
name: TOM
info:
   -10
   -20
   -30


# 5-1、引號 如果是有英文字母或者中文的,不加引號也是字串
info: "HELLO word"  # 引號可以不加 

# 5-2、什麼加引號:如果有特俗字元n 不加引號就原字元樣式輸出    如果顯示特殊字元效果:就加雙引號
 
info: "HELLOnwoord"


# 6-1、參照 一個資料可以使用很多地方,使用變數
# & 變數名   定義變數
# *變數名   參照變數
name: &a tom
name1: *a


# 7-1、能不能多個YAML 寫在一起,有字典也有列表  ,加分隔符  ---
-10
-20
-30
---
name: sq

# 8-1、yamL檔案可以有YAML
DATA: conf.yaml

第三方包 - pyyaml

pyyaml 的安裝:pip install PyYAML [若安裝失敗,參考 - 包與模組 章節的 如何安裝第三方包]

pyyaml 的匯入:import pyyaml

讀取 yaml 檔案的方法

用法如下:

file = open(yaml_file, 'r')
daya = yaml.load(file.read())
file.close

返回字典型別(範例):

{
    'name': '託尼·史塔克'
    'age': '52'
    'sex': 'man'
}

yaml檔案讀取演示案例

建立一個 test.yaml 檔案,內容如下:

name:
  託尼·史塔克    # 字串引號可以不加 【這裡的縮排使用的是tab鍵,所以如果直接複製貼上,在執行下方指令碼時會報錯,記得改成空格】
invention:
  - Iron Man Armor
  - Arc reactor
  - Ultron
teammate:
  - Steven Rogers
  - Thor Odinson
  - Natasha Romanoff
  - Bruce Banner
  - Clint Barton
apprentice:
  彼得·帕克
wife:
  佩珀·波茲
father:
  霍華德·史塔克

建立一個 test_yaml.py 檔案,讀取 test.yaml 檔案:

# coding:utf-8

import yaml


def read(path):
    with open(path, 'r') as file:
        data = file.read()
        result = yaml.load(data)
        # result = yaml.load(data, Loader=yaml.FullLoader)
        return result


if __name__ == '__main__':
    result = read('test.yaml')
    print(result)

這裡執行的時候出現了一個報錯 :TypeError: load() missing 1 required positional argument: 'Loader'。 如下圖:

這是因為在 YAML 5.1版本後棄用了yaml.load(file)這個用法,因為覺得很不安全,5.1版本之後就修改了需要指定Loader,通過預設載入器(FullLoader)禁止執行任意函數,該load函數也變得更加安全。所以我們需要將 result = yaml.load(data) 改為 result = yaml.load(data, Loader=yaml.FullLoader) 。

解決該 TypeError 不單單 只有 yaml.load(data, Loader=yaml.FullLoader) 這一個方法。

以下三選一即可解決該 TypeError

yaml.safe_load(file.read())

yaml.load(file.read(), Loader=yaml.FullLoader)

yaml.load(file.read(), Loader=yaml.CLoader)

執行結果如下:

到此這篇關於Python學習之yaml檔案的讀取詳解的文章就介紹到這了,更多相關Python yaml讀取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com