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
對象