配置文件Yaml之python版

2021-12-24 全棧運維
什麼是 yaml

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 pip

2、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

相關焦點

  • 【Python】常用配置文件匯總(INI、XML、JSON、YAML、PY)
    引言配置文件常為程序運行提供參數,為參數的統一管理提供便利。本文以Python語言為例,講解各種配置文件的用法。缺點雙引號太多,不適合做配置文件。PY是Python源碼後綴,在PY文件裡面定義字典可充當程序運行的配置文件。
  • Python之UnitTest中yaml文件使用
    DDT數據驅動的使用,我們可以讀取txt文本文件來實現數據和代碼的分離,其實我們還可以使用今天要介紹的這種方式,那就是直接讀取yaml文件PyYaml的安裝pip install pyyamlPyYaml的簡單使用準備yaml數據,例如下面yaml文件編寫測試代碼,必須從ddt導入file_data執行結果展示
  • python基礎——python解析yaml類型文件
    採用yaml作為配置文件,文件看起來直觀、簡潔、方便理解。yaml文件可以解析字典、列表和一些基本變量的數據結構。valuekey2:    sub_key1:value1    sub_keys:value22.2 列表- para1- para2- para32.3 普通變量        yaml配置文件,可以解析數字、字符串、布爾類型數據、時間日期格式
  • 5 分鐘掌握 Python 中常見的配置文件
    這時我們就應該選擇通用的配置文件類型來作為存儲這些固定的部分。目前常用且流行的配置文件格式類型主要有 ini、json、toml、yaml、xml 等,這些類型的配置文件我們都可以通過標準庫或第三方庫來進行解析。iniini 即 Initialize 初始化之意,早期是在 Windows 上配置文件的存儲格式。
  • java工具之解析yaml文件
    工具使用背景很多配置項都是使用yaml的格式進行配置的, 按一定的格式進行縮進
  • 現代配置指南——YAML 比 JSON 高級在哪?
    一般靜態化的配置會選擇 json 文件,而動態化的配置,涉及到引入其他模塊,因此會選擇 js 文件。還有現在許多新工具同時支持多種配置,比如 Eslint,兩種格式的配置任你選擇:後來不知道什麼時候,突然出現了一種以 .yaml 或 .yml 為後綴的配置文件。
  • YAML語言教程
    編程免不了要寫配置文件,怎麼寫配置也是一門學問。YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便。
  • ❲阮一峰❳YAML 語言教程
    來源:阮一峰原文地址:http://www.ruanyifeng.com/blog/2016/07/yaml.html  編程免不了要寫配置文件
  • YAML:可能並不是那麼完美 | Linux 中國
    我之前寫過為什麼將 JSON 用於人類可編輯的配置文件是一個壞主意[1],今天我們將討論 YAML 格式的一些常見問題。默認情況下不安全YAML 默認是不安全的。加載用戶提供的(不可信的)YAML 字符串需要仔細考慮。!!
  • [接口測試 - 基礎篇] 11 掌握下python解析YAML格式也是需要的
    開源優測社區        狀態: 已暫停        城市: 廣州        網址: www.testingunion.com注意:字符串不一定要用雙引號標識在縮排中空白字符的數目並不是非常重要,只要相同階層的元素左側對齊就可以了(不過不能使用TAB字符)允許在文件中加入選擇性的空行
  • 【第1257期】YAML 語言教程
    前言在用vuepress搭建網站的時候,在文件中發現README.md用yaml front matter語法寫,好奇就去了解下。
  • Python讀取ini配置文件
    python看過我之前文章的同學可能知道,最近一直在做百度語音合成的功能,進一步的延伸功能,此次是批量生成文章的語音文件目前是使用python來實現的,將代碼打包成了exe文件,方便客戶進行測試。下面說一下配置文件,本次直說ini格式的配置文件。創建ini文件在目錄中創建.ini文件,我們以config.ini文件名為例。進行創建。在創建好的文件內編寫配置信息。
  • 使用 pre-commit 配合 black、isort 自動格式化 Python 文件
    同時也支持配置文件自定義規則,詳細內容可以參考官方文檔 The uncompromising code formatter — Blackisort  則是用來規範 python 庫的引入的,按字母順序對 packages 進行排序,並自動分為不同的部分和類型,同樣可以通過
  • 使用golang解析yaml、json、xml文件
    : chongqing  hobby:    - 閱讀    - 王者榮耀- name: 夏老師  age: 27  address: chengdu  hobby:    - 吃吃喝喝- name: 姜總  age: 25  address: shanghai  hobby:    - talkshow
  • 如何快速成為一名優秀的YAML工程師?
    k8s所有的配置文件以及資源的定義配置文件都是基於YAML格式的,所以熟悉並掌握YAML是必要的。先說說YAML常用的校驗工具,然後再細說YAML的基本語法。yaml工具pip3 install pyyamlpython3 -c 'import yaml, sys; yaml.safe_load(sys.stdin)' < demo.yamlYaml命令行內高亮顯示[2],可直接在Github上進行下載二進位文件
  • 使用 Visual Studio Code 驗證 JCasC 配置文件
    通過開發 VSCode 插件來促進自動完成和驗證,從而增強開發人員的經驗,這將有助於開發人員在應用到 Jenkins 實例之前編寫正確的 yaml 文件。配置即代碼插件已被設計為 Jenkins 基於聲明式配置文件配置的基本方式,無需成為 Jenkins 專家亦可編寫這樣的文件,只需將配置過程中轉換成用於在 web UI 中執行的代碼即可。
  • python讀寫文件
    今天我們就以這幾個需求為背景來看看python是如何讀寫文件的。基本概念介紹我們知道python中一切都是對象,「文件」也不例外。下面的實驗可以看出文件是名叫『_io.TextIOWrapper』的class。
  • YAML語法詳細介紹
    它可以很簡單且清晰的表達對象、數組、標量等數據,並通過空白縮進來表達數據的層次結構,非常適合做配置文件,編輯數據結構和文件大綱等。很多程式語言(如 C, Java, Perl, Python, Ruby 等)都有其對應的模塊包可以處理 YAML 語言或 YAML 文件(以 yml 結尾)。
  • Python環境配置保姆教程(Anaconda、Jupyter、GPU環境)!
    這篇文章打算把一些必備的python環境配置過程記錄下來,這樣不管是新到了公司實習或者就職,還是新換了電腦,都可以借鑑這篇快速把環境搭建起來啦 😉由於我也是重裝了系統,所以算是從0開始搭建python環境,這次從anaconda安裝開始, 然後到cuda的相關安裝配置,再到cudnn的安裝配置,然後從anaconda中建立虛擬tensorflow
  • yolov5實戰之皮卡丘檢測
    環境準備安裝torch這些就不說了,本次訓練基於yolov5官方項目:https://github.com/ultralytics/yolov5 clone後,pip install -r requirements.txt安裝各項依賴 基本的目錄結構如下:data: 訓練數據和數據配置文件以及訓練配置 models: 模型配置文件 utils: 數據讀取、nms等各種訓練測試中用到的腳本