yaml 可以做配置文件,但是yaml不僅僅是配置文件,其本身就是一種語言,有自己的語法和使用規範。
yaml文件後綴是有要求的,必須為yml 注意和ini文件做對比
yaml 文件介紹1、基礎規範•大小寫敏感•使用縮進表示層級關係•縮進不允許使用tab,只允許空格•縮進的空格數不重要,只要相同層級的元素左對齊即可•'#'表示注釋
2、支持的類型•對象 這裡的對象是指 鍵值對的集合,類似python字典•數組•純量 類似我們說的常量,不可在分在變的。比如 字符串、布爾值、整數、浮點數、null、時間、日期等
3、yaml對象格式 key: value 冒號分隔,且冒號後面得有個空格
比如
# 基本配置
site_name: Colinspace website
site_url: http://blog.colinspace.com
# 嵌套配置
mysql_db: {host: 192.168.1.10, user: demouser}
# 嵌套配置也可以按照層級縮進配置,注意是空格縮進,而不是tab
mysql_db:
host: 192.168.1.10
user: demouser
4、yaml數組數組是以中橫線 - 開頭的一組配置,且支持多維數組。比如
# 數組說明
# 基本數組
fruits:
- apple
- banana
- orange
# 數組行內表示
fruits: ['apple', 'banana', 'orange']數組是有個數組名的,也就是配置的key,value是- 開頭的一組數據組成的數組,該組數據對其方式保持一致。
換句話說 中橫線開頭的,其對齊方式一樣的元素組成一個數組,重點記住這句話,因為這個是理解多維數組 的關鍵所在
5、多維數組我們先看幾個配置
# 多為數組, 這裡是二維數組
config_multi_array:
-
- apple
- banana
- orange
-
- potato
- tomato
- cucumber
# it's array, but not tow-dimension array
# one-dimension array with two elements
config_like_multi_array:
- fruits:
- apple
- banana
- orange
- vegetables:
- potato
- tomato
- cucumber
config_like_multi_array_v2:
-
fruits:
- apple
- banana
- orange
-
vegetables:
- potato
- tomato
- cucumber
config_like_multi_array_v3:
- fruits
- apple
- banana
- orange
- vegetables
- potato
- tomato
- cucumber
config_like_multi_array_v4:
fruits:
- apple
- banana
- orange
vegetables:
- potato
- tomato
- cucumber這裡我們先給出5種key配置方式的最終的結果如下,發現只有config_multi_array 是真正的二維數組。
"config_multi_array": [
[
"apple",
"banana",
"orange"
],
[
"potato",
"tomato",
"cucumber"
]
],
"config_like_multi_array": [
{
"fruits": [
"apple",
"banana",
"orange"
]
},
{
"vegetables": [
"potato",
"tomato",
"cucumber"
]
}
],
"config_like_multi_array_v2": [
{
"fruits": [
"apple",
"banana",
"orange"
]
},
{
"vegetables": [
"potato",
"tomato",
"cucumber"
]
}
],
"config_like_multi_array_v3": [
"fruits - apple - banana - orange",
"vegetables - potato - tomato - cucumber"
],
"config_like_multi_array_v4": {
"fruits": [
"apple",
"banana",
"orange"
],
"vegetables": [
"potato",
"tomato",
"cucumber"
]
},從結果也證明 config_multi_array 是真正的二維數組,所以我們得知,數組一定是- 開頭,
•
如果要表示多維數組,那麼第一維的- 後面不能接任何東西,比如 config_multi_array
•
如果後面接了 key 但是 key 緊接著有冒號:的話那麼就是對象,該 key 就是對象的名稱;例如這裡的 config_like_multi_array 和 config_like_multi_array_v2,這兩個的效果是等價的;這種做法其實在 "數組" 中嵌套 "鍵值對"
為什麼?記得上面說的 中橫線開頭的,其對齊方式一樣的元素組成一個數組 ,所以這兩個肯定是數組,而且有兩個元素。帶冒號:又符合 key:value 對象的組成,所以每個元素都是對象,對象名名是key,值是個數組
•
如果後面接了 key 但是 key 緊接著沒有冒號:的話,他就會和後面的數組元素一起組成一個數組,比如這裡的 config_like_multi_array_v3,其實這種配置方式是"錯誤"的
•
另外比如第五種配置config_like_multi_array_v4方式,沒有-開頭,所以就是個對象,每個對象的值是個數組,這種方式其實是種複合結構,或者叫 在 "鍵值對" 中嵌套 "數組"
6、複合結構符合結構其實就是 對象和數組的結合使用了,比如
# 複合結構,即 對應和數組組合
# 複合結構,即 對應和數組組合
composite_structure:
name: compound_demo
classes:
-
class_one: 1
name: 三年一班
students: 32
-
class_two: 2
name: 三年二班
students: 35這裡 composite_structure 對象 中有對象結構name 和 classes,而對象classes 的值是個數組,有兩個元素,每個元素是個對象,又由三個對象構成
python操作yaml文件一個yaml文件中可以存在多個部分,每個部分開頭 ---
•python讀取解析yaml文件
yaml.load(f_handler, Loader=yaml.Loader) 解析單部分文件
yaml.load_all(f_handler, Loader=yaml.FullLoader) 解析多部份文件
•python 寫入配置到 yaml 文件
yaml.dump(python_dict_obj, f_handler)
•其他方法
loader.items() 列出所有配置項(key和value)
loader.keys() 列出所有配置項的key
loader.values() 列出所有配置項的value
loader.get(key) 獲取某個配置項key對應的值
python 操作 yaml 腳本
#!/usr/bin/env python
# encoding: utf-8
# Author: colinspace.com
# Desc: python yaml demo
#
import sys
import yaml
import json
yml_file = "demo.yml"
yml_file_multi = "multi.yml"
print("\n==> 轉化yaml內容為字典或者列表 - 單部分")
with open(yml_file, 'r', encoding='utf-8') as f:
try:
loader = yaml.load(f, Loader=yaml.Loader)
# type is dict with single quotes; can't use python -m json.tool to format result
# print(type(loader))
# print(loader)
# type is str with double quotes
# print(type(json.dumps(loader)))
print(json.dumps(loader))
except Exception as e:
print(e)
print("\n==> 轉化yaml內容為字典或者列表 - 多部分")
with open(yml_file_multi, 'r', encoding='utf-8') as f:
try:
# loader here is generator
loader = yaml.load_all(f, Loader=yaml.FullLoader)
for item in loader:
print(json.dumps(item))
except Exception as e:
print(e)
print("\n==> 嘗試寫入配置到yaml文件")
py_dict = {
"cache": {
"host": "192.168.1.11",
"port": 3306
},
"languages": ["python", "golang", "Java"]
}
with open("demo_write.yml", "w", encoding="utf-8") as f:
yaml.dump(py_dict, f)
print("==> 寫入之後的結果")
with open("demo_write.yml", "w", encoding="utf-8") as f:
print(f.read())結果如下
結果在哪裡?? 😜😜😜😜
往下看
往下看
往下看
再往下看
再往下看
想看結果自己敲代碼 然後親自嘗試下不是更好的麼。編程除了「看」理論知道,也需要「幹」代碼才行哦!
擴展1、windows下no module named pip 報錯
在windows的 cmd 命令行中輸入如下命令進行修正
如果想要升級 pip 需要執行如下命令
# 不能直接使用 pip install -U pip
# -U 等效於 --upgrade
python -m pip install -U pip2、python json.tool 中文亂碼
顯示亂碼的原因是,json為了安全會把內容都轉義為ascii編碼,我們可以通過參數ensure_ascii 不讓json強行將內容都轉義為ascii編碼,中文原樣輸出即可。
python2 和 python3 的方式有所不同
python2 需要修改源碼的配置,在系統安裝路徑下找到 json/tools.py 文件,添加參數配置ensure_ascii=False,比如
json.dump(obj, outfile, sort_keys=True, indent=4, separators=(',', ': '))
修改為
json.dump(obj, outfile, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False)python3 添加參數 --no-ensure-ascii 即可 ,我們從其輸出用法可以得到
usage: python -m json.tool [-h] [--sort-keys] [--no-ensure-ascii] [--json-lines]
[--indent INDENT | --tab | --no-indent | --compact]
[infile] [outfile]所以使用如下命令
python demo_yaml.py | python -m json.tool --no-ensure-ascii