1. 程式人生 > 其它 >python 之yaml模組使用總結

python 之yaml模組使用總結

一、yaml檔案介紹

YAML是一種簡潔的非標記語言。其以資料為中心,使用空白,縮排,分行組織資料,從而使得表示更加簡潔。

1.1 yaml檔案規則

基本規則:
    大小寫敏感
    使用縮排表示層級關係
    縮排時不允許使用Tab鍵,只允許使用空格。
    縮排的空格數目不重要,只要相同層級的元素左側對齊即可
    使用#表示註釋
    字串可以不用引號標註

1.2 yaml檔案資料結構

    物件:鍵值對的集合(簡稱 "對映或字典")
    鍵值對用冒號 “:” 結構表示,冒號與值之間需用空格分隔
    陣列:一組按序排列的值(簡稱 "序列或列表")
    陣列前加有 “-” 符號,符號與值之間需用空格分隔
    純量(scalars):單個的、不可再分的值(如:字串、bool值、整數、浮點數、時間、日期、null等)
    None值可用null可 ~ 表示

二、安裝yaml

pip命令: pip install PyYaml

PyYaml引入:import yaml

三、python中讀取yaml配置檔案

3.1 讀取yaml檔案資料

python通過open方式讀取檔案資料,再通過load函式將資料轉化為列表或字典;

1 import yaml
2 
3 def get_yaml():
4     file_yaml = 'test.yaml'
5     rf = open(file=file_yaml, mode='r', encoding='utf-8')
6     crf = rf.read()
7     rf.close()  #
關閉檔案 8 yaml_data = yaml.load(stream=crf, Loader=yaml.FullLoader) 9 return yaml_data

3.1.1 yaml檔案資料為鍵值對

(1)yaml檔案中內容為鍵值對:

# yaml鍵值對:即python中字典
usr: my
psw: 123455
s: " abc\n"

python解析yaml檔案後獲取的資料:

{'usr': 'my', 'psw': 123455, 's': ' abc\n'}

(2)yaml檔案中內容為“鍵值對'巢狀"鍵值對"

# yaml鍵值對巢狀:即python中字典巢狀字典
usr1:
  name: a
  psw: 123
usr2:
  name: b
  psw: 456

python解析yaml檔案後獲取的資料:

{'usr1': {'name': 'a', 'psw': 123}, 'usr2': {'name': 'b', 'psw': 456}}



(3)yaml檔案中“鍵值對”中巢狀“陣列”

# yaml鍵值對中巢狀陣列
usr3:
  - a
  - b
  - c
usr4:
  - b
python解析yaml檔案後獲取的資料:

{'usr3': ['a', 'b', 'c'], 'usr4': ['b']}

 3.1.2 yaml檔案資料為陣列

(1)yaml檔案中內容為陣列
# yaml陣列
- a
- b
- 5
python解析yaml檔案後獲取的資料:
['a', 'b', 5]

(2)yaml檔案“陣列”中巢狀“鍵值對”
# yaml"陣列"中巢狀"鍵值對"
- usr1: aaa
- psw1: 111
  usr2: bbb
  psw2: 222
python解析yaml檔案後獲取的資料:
[{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]

3.1.3 yaml檔案中基本資料型別:

# 純量
s_val: name              # 字串:{'s_val': 'name'}
spec_s_val: "name\n"    # 特殊字串:{'spec_s_val': 'name\n'}
num_val: 31.14          # 數字:{'num_val': 31.14}
bol_val: true           # 布林值:{'bol_val': True}
nul_val: null           # null值:{'nul_val': None}
nul_val1: ~             # null值:{'nul_val1': None}
time_val: 2018-03-01t11:33:22.55-06:00     # 時間值:{'time_val': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)}
date_val: 2019-01-10    # 日期值:{'date_val': datetime.date(2019, 1, 10)}

 3.2. yaml檔案內中引用

yaml檔案中內容:
animal3: &animal3 fish    # "&"符號標記錨點
test: *animal3     # 直接使用*號引用
python讀取的資料:
{'animal3': 'fish', 'test': 'fish'}

四、python中讀取多個yaml文件

1. 多個文件在一個yaml檔案,使用 --- 分隔方式來分段
如:yaml檔案中資料
# 分段yaml檔案中多個文件
---
animal1: dog
age: 2
---
animal2: cat
age: 3

2. python指令碼讀取一個yaml檔案中多個文件方法
python獲取yaml資料時需使用load_all函式來解析全部的文件,再從中讀取物件中的資料
# yaml檔案中含有多個文件時,分別獲取文件中資料

 1 def get_yaml_load_all(yaml_file):
 2     # 開啟yaml檔案
 3     file = open(yaml_file, 'r', encoding="utf-8")
 4     file_data = file.read()
 5     file.close()
 6     all_data = yaml.full_load_all(file_data)
 7     for data in all_data:
 8         print(data)
 9 current_path = os.path.abspath(".")
10 yaml_path = os.path.join(current_path, "config.yaml")
11 get_yaml_load_all(yaml_path)

"""結果
{'animal1': 'dog', 'age': 2}
{'animal2': 'cat', 'age': 3}
"""

五、python物件生成yaml文件

1. 直接匯入yaml(即import yaml)生成的yaml文件

通過yaml.dump()方法不會將列表或字典資料進行轉化yaml標準模式,只會將資料生成到yaml文件中

# 將python物件生成yaml文件

 1 import yaml
 2 import os
 3 
 4 
 5 def generate_yaml_doc(yaml_file):
 6     py_object = {'school': 'zhang',
 7                  'students': ['a', 'b']}
 8     file = open(yaml_file, 'w', encoding='utf-8')
 9     yaml.dump(py_object, file)
10     file.close()
11 
12 
13 current_path = os.path.abspath(".")  # 當前檔案目錄絕對路徑
14 yaml_path = os.path.join(current_path, "generate.yaml")
15 generate_yaml_doc(yaml_path)

""生成yaml檔案內容:

school: zhang
students:
- a
- b

"""
部分內容摘自:https://www.cnblogs.com/lisa2016/p/11764808.html