python之yaml模塊

一、yaml文件介紹

yaml是一個專門用來寫配置文件的語言。
1. yaml文件規則

區分大小寫;
使用縮進表示層級關係;
使用空格鍵縮進,而非Tab鍵縮進
縮進的空格數目不固定,只需要相同層級的元素左側對齊;
文件中的字符串不需要使用引號標註,但若字符串包含有特殊字符則需用引號標註;
註釋標識爲#

2. yaml文件數據結構

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

二、python中讀取yaml配置文件

1. 安裝yaml

		pip3 install pyyaml

2、讀取yaml文件數據

python通過open方式讀取文件數據,再通過load函數將數據轉化爲列表或字典;

import yaml
import os


def get_yaml_data(yaml_file):
    # 打開yaml文件
    print("***獲取yaml文件數據***")
    file = open(yaml_file, 'r', encoding="utf-8")
    file_data = file.read()
    file.close()

    print(file_data)
    print("類型:", type(file_data))#字符串類型數據

    # 將字符串轉化爲字典或列表
    print("***轉化yaml數據爲字典或列表***")
    data = yaml.load(file_data)
    print(data)
    print("類型:", type(data))#字典類型
    return data


current_path = os.path.abspath(".")#獲取當前文件的路徑
yaml_path = os.path.join(current_path, "config.yaml")#傳入當前路徑下的config.yaml文件
if os.path.exists(yaml_path):#如果存在這個文件
    get_yaml_data(yaml_path)
else:
    print('不存在文件config.yaml, 請添加')




運行結果:


***獲取yaml文件數據***
'a': 123
'b': 456
類型: <class 'str'>
***轉化yaml數據爲字典或列表***
{'a': 123, 'b': 456}
類型: <class 'dict'>

3. 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']}

練習:

yaml文件內容:
'a': 123
'b': 456

dd:
  aa: 987
  bb: 888
cc:
  rr: 111
  ee: 222

s:
  - 8
  - 9
  - 20

---------------------按照上面的程序輸出的結果:

***獲取yaml文件數據***
'a': 123
'b': 456

dd:
  aa: 987
  bb: 888
cc:
  rr: 111
  ee: 222

s:
  - 8
  - 9
  - 20
類型: <class 'str'>
***轉化yaml數據爲字典或列表***
{'a': 123, 'b': 456, 'dd': {'aa': 987, 'bb': 888}, 'cc': {'rr': 111, 'ee': 222}, 's': [8, 9, 20]}
類型: <class 'dict'>


4. yaml文件數據爲數組

(1)yaml文件中內容爲數組

#yaml數組
- a
- b
- 5

python解析yaml文件後獲取的數據:

['a', 'b', 5]

(2)yaml文件“數組”中嵌套“鍵值對”

#yaml"數組"中嵌套"鍵值對"
- usr1: aaa
- psw1: 111
  usr2: bbb
  psw2: 222

#它會把  psw1: 111 usr2: bbb psw2: 222 看作是一個字典

python解析yaml文件後獲取的數據:

[{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]

5. 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)}

6. yaml文件中引用

yaml文件中內容

animal3: &animal3 fish
test: *animal3

python讀取的數據

{'animal3': 'fish', 'test': 'fish'}

三、python中讀取多個yaml文檔

1. 多個文檔在一個yaml文件,使用 — 分隔方式來分段

# 分段yaml文件中多個文檔
---
animal1: dog
age: 2
---
animal2: cat
age: 3

2. python腳本讀取一個yaml文件中多個文檔方法
python獲取yaml數據時需使用load_all函數來解析全部的文檔,再從中讀取對象中的數據

#yaml文件中含有多個文檔時,分別獲取文檔中數據
import os,yaml
def get_yaml_load_all(yaml_file):
    # 打開yaml文件
    file = open(yaml_file, 'r', encoding="utf-8")
    file_data = file.read()
    file.close()
    all_data = yaml.load_all(file_data)#轉換讀取的所有數據爲列表或者字典
    for data in all_data:
        print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "config.yaml")
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文檔
import yaml
def generate_yaml_doc(yaml_file):
    py_object = {'school': 'zhang',
                 'students': ['a', 'b']}
    file = open(yaml_file, 'w', encoding='utf-8')
    yaml.dump(py_object, file)
    file.close()
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc(yaml_path)
"""結果
school: zhang
students: [a, b]

“”"
2. 使用ruamel模塊中的yaml方法生成標準的yaml文檔

(1)使用ruamel模塊中yaml前提條件

使用yaml需要安裝的模塊:ruamel.yaml(pip3 install ruamel.yaml);
導入的模塊:from ruamel import yaml

(2)ruamel模塊生成yaml文檔

def generate_yaml_doc_ruamel(yaml_file):
    from ruamel import yaml
    py_object = {'school': 'zhang',
                 'students': ['a', 'b']}
    file = open(yaml_file, 'w', encoding='utf-8')
    yaml.dump(py_object, file, Dumper=yaml.RoundTripDumper)
    file.close()
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc_ruamel(yaml_path)
"""結果
school: zhang
students:
- a
- b
"""

(3)ruamel模塊讀取yaml文檔


##yaml文件內容:

school: zhang
students:
       - a
       - b


#通過from ruamel import yaml讀取yaml文件
def get_yaml_data_ruamel(yaml_file):
    from ruamel import yaml
    file = open(yaml_file, 'r', encoding='utf-8')
    data = yaml.load(file.read(), Loader=yaml.Loader)
    file.close()
    print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "dict_config.yaml")
get_yaml_data_ruamel(yaml_path)

輸出:
{'school': 'zhang', 'students': ['a', 'b']}

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