YAML 數據格式詳解

在這里插入圖片描述

1. YAML 概念

YAML (YAML Ain’t Markup Language) 是一種人性化的數據序列化格式:

  • 專注于數據而非標記(與 XML 不同)
  • 使用簡潔的語法表示復雜數據結構
  • 可讀性高,適合人類編寫和閱讀
  • 廣泛應用于配置文件(如 Docker Compose, Ansible, Kubernetes)

2. YAML 核心原理

  • 縮進表示層級:類似 Python,使用空格縮進
  • 最小化符號:避免引號、括號等干擾符號
  • 數據類型推斷:自動識別數字、布爾值等類型
  • 錨點與引用:支持數據復用(& 定義錨點,* 引用)
  • 多文檔支持:單個文件可包含多個文檔(用 --- 分隔)

3. YAML 語法規范

基本結構

# 注釋以 # 開頭
server: web01  # 鍵值對
ports:- 80        # 列表項- 443
environment: production
config:max_connections: 1000  # 嵌套對象timeout: 30

核心語法規則

  1. 縮進規則
    • 使用空格(不能使用 Tab)
    • 同一層級縮進必須一致
  2. 數據類型
    • 字符串:可加引號也可不加(除非有特殊字符)
    • 數字:整數(42)、浮點數(3.14
    • 布爾值:true/falseyes/no
    • 空值:null~
    • 日期:2023-11-15(ISO 8601 格式)
  3. 數據結構
    • 列表(數組):使用 - 開頭
    • 對象(字典):使用 key: value 格式
  4. 多行文本
    description: |這是多行文本保留所有換行符summary: >這是折疊文本會合并為單行
    
  5. 特殊語法
    • 錨點 &name 和引用 *name
    • 合并 <<: *name(合并映射)

4. Python YAML API (PyYAML)

安裝

pip install pyyaml

核心功能

函數功能主要參數
yaml.safe_load()安全解析 YAMLstream(文件或字符串)
yaml.load()解析 YAML(不安全)stream, Loader
yaml.safe_dump()安全序列化為 YAMLdata, stream, indent
yaml.dump()序列化為 YAMLdata, default_flow_style

關鍵參數

  • dump/dump_all
    • indent:縮進空格數
    • default_flow_style:是否使用流式風格(默認 False)
    • allow_unicode:是否允許 Unicode 字符
    • sort_keys:是否按鍵排序
  • load/load_all
    • Loader:指定加載器(推薦 yaml.SafeLoader

5. YAML 處理流程

yaml.dump
yaml.safe_load
yaml.dump
yaml.safe_load
yaml.dump_all
yaml.safe_load_all
Python對象
YAML字符串
Python對象
YAML文件
多文檔數據
多文檔YAML

6. 應用示例

示例1:基本讀寫

輸入 (Python對象):

data = {"server": "web01","ports": [80, 443],"environment": "production","backup": True,"config": {"max_connections": 1000,"timeout": 30.5}
}

序列化 (Python → YAML):

import yaml# 轉換為YAML字符串
yaml_str = yaml.dump(data, indent=2)
print(yaml_str)

輸出 (YAML字符串):

server: web01
ports:
- 80
- 443
environment: production
backup: true
config:max_connections: 1000timeout: 30.5

反序列化 (YAML → Python):

# 從YAML字符串轉換回Python對象
loaded_data = yaml.safe_load(yaml_str)
print(loaded_data["ports"][0])  # 輸出: 80

示例2:文件操作

寫入YAML文件:

config = {"database": {"host": "db.example.com","port": 3306,"user": "admin","password": "secret"},"logging": {"level": "debug","path": "/var/log/app.log"}
}with open("config.yaml", "w") as f:yaml.dump(config, f, indent=4, default_flow_style=False)

生成的config.yaml:

database:host: db.example.comport: 3306user: adminpassword: secret
logging:level: debugpath: /var/log/app.log

讀取YAML文件:

with open("config.yaml", "r") as f:loaded_config = yaml.safe_load(f)print(loaded_config["database"]["host"])  # 輸出: db.example.com

示例3:復雜結構處理

YAML輸入 (network.yaml):

network:devices:- name: router01interfaces:- name: Gig0/0ip: 192.168.1.1mask: 255.255.255.0- name: Gig0/1ip: 10.0.0.1mask: 255.255.255.252ospf:enabled: trueareas: [0, 1]- name: switch01vlan:default: 1enabled: yes

Python解析代碼:

import yamlwith open("network.yaml") as f:data = yaml.safe_load(f)for device in data["network"]["devices"]:print(f"設備: {device['name']}")if "interfaces" in device:for interface in device["interfaces"]:print(f"  接口: {interface['name']}, IP: {interface['ip']}")

輸出:

設備: router01接口: Gig0/0, IP: 192.168.1.1接口: Gig0/1, IP: 10.0.0.1
設備: switch01

示例4:錨點與引用

YAML輸入:

defaults: &defaultsadapter: postgreshost: localhostport: 5432development:<<: *defaultsdatabase: dev_dbtest:<<: *defaultsdatabase: test_db

Python解析后:

{'defaults': {'adapter': 'postgres','host': 'localhost','port': 5432},'development': {'adapter': 'postgres','host': 'localhost','port': 5432,'database': 'dev_db'},'test': {'adapter': 'postgres','host': 'localhost','port': 5432,'database': 'test_db'}
}

示例5:多文檔處理

YAML輸入 (multi_doc.yaml):

---
server: web01
status: active
...
---
server: db01
status: maintenance
...

Python讀取多文檔:

with open("multi_doc.yaml") as f:documents = list(yaml.safe_load_all(f))for doc in documents:print(f"服務器: {doc['server']}, 狀態: {doc['status']}")

輸出:

服務器: web01, 狀態: active
服務器: db01, 狀態: maintenance

7. 安全注意事項

  1. 避免使用 yaml.load():可能執行任意代碼(使用 safe_load 代替)
  2. 驗證來源:不要加載不可信的 YAML 文件
  3. 自定義安全加載器
    from yaml import SafeLoaderclass RestrictedLoader(SafeLoader):pass# 禁用特定標簽
    RestrictedLoader.add_constructor(None, None)
    

8. 常見錯誤處理

# 縮進錯誤示例
bad_yaml = """
server: web01ports:  # 錯誤:不應縮進- 80
"""try:data = yaml.safe_load(bad_yaml)
except yaml.YAMLError as e:print(f"YAML解析錯誤: {e}")# 輸出: mapping values are not allowed here

9. 最佳實踐

  1. 字符串引號:當字符串包含 :# 等特殊字符時使用引號
  2. 列表縮進:列表項使用相同縮進
  3. 復雜結構:避免超過 4 層嵌套
  4. 行內風格:簡單結構可使用行內風格(如 ports: [80, 443]
  5. 多文檔分隔:使用 --- 分隔多個配置段
  6. 數據類型明確:對可能混淆的類型(如 yes)添加類型標簽
    is_active: !!bool "yes"  # 明確指定為布爾值
    

10. YAML 與其他格式對比

特性YAMLJSONXML
可讀性★★★★★★★★☆☆★★☆☆☆
簡潔性★★★★★★★★★☆★☆☆☆☆
數據類型豐富基本文本為主
注釋支持???
錨點引用???
學習曲線

總結

YAML 是自動化運維中最重要的配置文件格式之一,主要特點包括:

  • 極高的可讀性和簡潔性
  • 靈活的數據結構表示
  • 支持復雜嵌套和引用
  • 與腳本語言(如 Python)自然兼容
  • 廣泛應用于 Ansible、Kubernetes、Docker 等工具

掌握 YAML 能幫助您高效處理各種配置管理任務,提升自動化運維效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85794.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react擴展

首先補充一下上個章節的一點結尾內容。reducer是一個純函數&#xff0c;純函數指的是當我們在redux里面定義了我們需要共享的對象后&#xff0c;我們是不可以對共享的對象本身進行改變的。我們在獲取更新后的共享數據時&#xff0c;要去重新定義一個新的變量來獲取更新后的共享…

6.獲取圖片灰度與縮放

目錄 一、Halcon 1. 獲取像素坐標以及灰度 2. 拖動縮放 3.圖像縮放的實現方式 二、VS聯合編程 1.獲取像素坐標和灰度 2.拖動縮放 一、Halcon 1. 獲取像素坐標以及灰度 *1. 獲取像素坐標 * 1. get_mposition * 2. halcon窗口事件自帶坐標數據 * *2. 獲取像素灰度 *…

無人機+AI:革新集裝箱箱號識別的智能解決方案

在現代化物流體系中&#xff0c;集裝箱箱號識別是貨物追蹤與管理的核心環節。然而&#xff0c;傳統的人工巡檢或固定攝像頭識別方式存在效率低、覆蓋范圍有限、易受環境干擾等問題&#xff0c;難以滿足日益增長的物流需求。基于無人機與AI技術的集裝箱箱號識別系統&#xff0c;…

一種新的參數高效微調方法-LoRI

論文&#xff1a;LoRI: Reducing Cross-Task Interference in Multi-Task Low-Rank Adaptation LoRA 具體參考 1. 引言與背景&#xff1a;為什么需要 LoRI&#xff1f; 這篇論文提出了一種新的參數高效微調&#xff08;PEFT&#xff09;方法&#xff0c;名為 LoRA with Reduce…

Go網絡編程:基于TCP的網絡服務端與客戶端

Go 語言的 net 包為網絡編程提供了簡潔高效的接口。我們可以使用它快速構建 TCP 網絡服務&#xff0c;如聊天服務器、RPC、微服務通信等。 一、TCP簡介 TCP&#xff08;Transmission Control Protocol&#xff09;是面向連接的、可靠的傳輸協議&#xff0c;通信模型為客戶端-服…

【StarRocks系列】架構、核心概念

目錄 一、架構&#xff1a;分布式 MPP 列式存儲 向量化引擎 二、存儲&#xff1a;高性能列式存儲引擎 三、表設計&#xff1a;三類模型適配不同場景 四、數據寫入&#xff1a;多種方式支持實時與批量 五、數據讀取&#xff1a;極致優化的查詢引擎 總結&#xff1a;Star…

從源碼到生產:Apache 2.4.57 自動化安裝實戰指南(附腳本)

引言&#xff1a;為何選擇源碼安裝 Apache&#xff1f; 在服務器運維場景中&#xff0c;源碼編譯安裝 Apache HTTP Server 是實現精細化配置的重要方式。相比包管理器安裝&#xff0c;源碼安裝可自定義模塊組合、適配特定依賴環境&#xff0c;并精確控制版本。本文將通過自動化…

iOS開發中的安全實踐:如何通過Ipa混淆與加固確保應用安全

隨著移動應用技術的不斷發展&#xff0c;開發者越來越重視應用的安全性&#xff0c;尤其是iOS應用。無論是面對大規模的數據泄露問題&#xff0c;還是在應用上線后避免被逆向破解&#xff0c;開發者們都需要采取一系列技術手段來保護應用。然而&#xff0c;很多開發者在應用開發…

JAVA實戰開源項目:智慧生活商城系統 (Vue+SpringBoot) 附源碼

本文項目編號 T 245 &#xff0c;文末自助獲取源碼 \color{red}{T245&#xff0c;文末自助獲取源碼} T245&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

GNU Octave 基礎教程(8):GNU Octave 常用數學函數

目錄 一、基本算術運 二、初等數學函數 三、三角函數與反三角函數 四、統計函數 五、復數與其他函數 ? 小結 &#x1f51c; 下一講預告 GNU Octave 內置了大量數學函數&#xff0c;涵蓋初等數學、線性代數、復數運算、統計函數等&#xff0c;非常適合科研、工程計算使用…

Go語言中的文件與IO:JSON、CSV、XML處理

在數據交換與存儲中&#xff0c;JSON、CSV、XML 是常見格式。Go 標準庫為這些格式提供了強大且易用的支持&#xff0c;涵蓋結構體映射、讀寫文件、編碼解碼等操作。 一、JSON處理&#xff08;encoding/json&#xff09; 1. 基本使用&#xff1a;結構體 <-> JSON type U…

三種語言寫 MCP

參考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…

Python訓練營-Day38-Dataset和Dataloader類

在遇到大規模數據集時&#xff0c;顯存常常無法一次性存儲所有數據&#xff0c;所以需要使用分批訓練的方法。為此&#xff0c;PyTorch提供了DataLoader類&#xff0c;該類可以自動將數據集切分為多個批次batch&#xff0c;并支持多線程加載數據。此外&#xff0c;還存在Datase…

SVN上傳代碼

SVN&#xff08;Subversion&#xff09;是一個常用的版本控制系統&#xff0c;提供了對代碼管理和協作的支持。以下是SVN常見操作&#xff08;如獲取代碼、上傳代碼、合并沖突處理等&#xff09;的命令行流程及實例&#xff1a; 1. 獲取代碼&#xff08;Checkout&#xff09; 在…

【appium】2.初始連接腳本配置

連接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…

FliTik翻頁時鐘v1.1.25.36,支持安卓TV/手機/車機+windows電腦端

FliTik翻頁時鐘v1.1.25.36&#xff0c;支持安卓TV/手機/車機windows電腦端 FliTik翻頁時鐘是一款集高顏值與強大功能于一身的全平臺數字時鐘工具類應用&#xff0c;支持TV、iOS、安卓、PC以及鴻蒙系統。它不僅擁有精美的翻頁動畫…

以AI賦能創意未來:即夢3.0與Seedance1.0Lite重磅登陸POE!

近年來&#xff0c;隨著人工智能技術的不斷突破&#xff0c;AI模型的應用場景也在逐漸拓寬。在這一過程中&#xff0c;如何整合和利用現有的AI技術&#xff0c;實現更為便捷的創作服務&#xff0c;成為了許多科技企業關注的焦點。近日&#xff0c;全球知名的AI模型整合平臺POE正…

云計算與5G:如何利用5G網絡優化云平臺的性能

想象一下&#xff0c;你正在用手機看視頻、進行在線游戲&#xff0c;甚至是使用云存儲來保存你的重要文件。所有這些背后&#xff0c;其實都離不開一個無形的力量——云計算。而今天&#xff0c;5G網絡的出現&#xff0c;就像為這些云服務加裝了一對翅膀&#xff0c;讓它們飛得…

GPT-1 與 BERT 架構

GPT-1 架構特點 僅解碼器架構&#xff1a;擯棄了傳統transformer中的編碼器層&#xff0c;而是直接用解碼器和自注意力&#xff0c;同時拋棄掉了交叉多頭注意力層&#xff0c;自注意力通過mask來完成計算。注意力塊添加到12個&#xff0c;Attention的輸出維數為762維&#xff0…

Day04_C語言基礎數據結構重點復習筆記20250618

1.什么是計算機的大小端存儲&#xff1f; 答&#xff1a;大端是數據的高位字節存儲在低地址&#xff0c;低位字節存儲在高地址&#xff0c;網絡協議&#xff08;如TCP/IP&#xff09;通常采用大端序&#xff08;稱為“網絡字節序”&#xff09;。例如&#xff1a;32位整數 0x12…