python 使用yaml模塊

python:yaml模塊
1、yaml文件介紹
YAML是一種簡潔的非標記語言。其以數據爲中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔。
1. yaml文件規則
基本規則:
    大小寫敏感
    使用縮進表示層級關係
    縮進時不容許使用Tab鍵,只容許使用空格。
    縮進的空格數目不重要,只要相同層級的元素左側對齊便可
    使用#表示註釋
    字符串能夠不用引號標註

2. yaml文件數據結構

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

2、安裝yaml

pip命令: pip install PyYaml
引入:import yaml
用python讀取yaml文件以下:數組

代碼:
import yaml
from Common.dir_config import *

# 打開yaml文件
fs = open(os.path.join(caps_dir, "data.yaml"),encoding="UTF-8")
datas = yaml.load(fs)
print(datas)
備註:yaml版本5.1以後棄用,YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated
代碼改後:
import yaml
from Common.dir_config import *

# 打開yaml文件
fs = open(os.path.join(caps_dir, "data.yaml"),encoding="UTF-8")
datas = yaml.load(fs,Loader=yaml.FullLoader)  #添加後就不警告了
print(datas)數據結構


3、python中讀取yaml配置文件
1. 前提條件

python中讀取yaml文件前須要安裝pyyaml和導入yaml模塊:

    使用yaml須要安裝的模塊爲pyyaml(pip3 install pyyaml);
    導入的模塊爲yaml(import yaml)

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")
get_yaml_data(yaml_path)

"""
***獲取yaml文件數據***
# yaml鍵值對:即python中字典
usr: my
psw: 123455
類型:<class 'str'>
***轉化yaml數據爲字典或列表***
{'usr': 'my', 'psw': 123455}
類型:<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']}

4. 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}]

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'}

3、python中讀取多個yaml文檔
1. 多個文檔在一個yaml文件,使用 --- 分隔方式來分段

如:yaml文件中數據

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

2. python腳本讀取一個yaml文件中多個文檔方法

python獲取yaml數據時需使用load_all函數來解析所有的文檔,再從中讀取對象中的數據

# 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}
"""

4、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文檔

# 經過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)函數

**************************************************spa

上代碼scala

 1 import yaml
 2 import os
 3 
 4 
 5 
 6 #單個文檔
 7 def get_yaml_data(yaml_file):
 8     #打開yaml文件
 9     print("***獲取yam文件數據***")
10     file=open(yaml_file,'r',encoding='utf-8')
11     file_data=file.read()
12     file.close()
13 
14     print(file_data)
15     print("類型",type(file_data))
16 
17     #將字符串轉化爲字典或列表
18     print("***轉化yaml數據爲字典或列表***")
19     data=yaml.safe_load(file_data)  #safe_load,safe_load,unsafe_load
20     print(data)
21     print("類型",type(data))
22     return data
23 
24 current_path=os.path.abspath(".")
25 yaml_path=os.path.join(current_path,"config.yaml")
26 print('--------------------',yaml_path)
27 get_yaml_data(yaml_path)
28 
29 
30 #yaml文件中含多個文檔時,分別獲取文檔中數據
31 def get_yaml_load_all(yaml_file):
32     #打開文件
33     file=open(yaml_file,'r',encoding='utf-8')
34     file_data=file.read()
35     file.close()
36 
37     all_data=yaml.load_all(file_data,Loader=yaml.FullLoader)
38     for data in all_data:
39         print('data-----',data)
40 
41 current_path=os.path.abspath(".")
42 yaml_path=os.path.join(current_path,"configall.yaml")
43 get_yaml_load_all(yaml_path)
44 
45 
46 #生成yaml文檔
47 def generate_yaml_doc(yaml_file):
48     py_ob={"school":"zhang",
49            "students":['a','b']}
50     file=open(yaml_file,'w',encoding='utf-8')
51     yaml.dump(py_ob,file)
52     file.close()
53 
54 current_path=os.path.abspath(".")
55 yaml_path=os.path.join(current_path,"generate.yaml")
56 generate_yaml_doc(yaml_path)

執行結果code

 

 


原文:https://www.jianshu.com/p/eaa1bf01b3a6

對象

相關文章
相關標籤/搜索