最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?yaml格式配置文件操作實(shí)戰(zhàn)教程

 更新時(shí)間:2025年11月07日 11:23:08   作者:諸神緘默不語(yǔ)  
yaml是專門用來(lái)寫配置文件的語(yǔ)言,非常簡(jiǎn)潔和強(qiáng)大,用ini也能寫配置文件,看了yaml后,發(fā)現(xiàn)這個(gè)更直觀,更方便,有點(diǎn)類似于json格式,這篇文章主要介紹了Python?yaml格式配置文件操作的相關(guān)資料,需要的朋友可以參考下

在現(xiàn)代軟件開(kāi)發(fā)中,配置管理是至關(guān)重要的一環(huán)。告別硬編碼,擁抱靈活的配置文件,YAML 正是為此而生的理想選擇之一。

1. 引言:為什么選擇 YAML?

在 Python 項(xiàng)目中,我們經(jīng)常需要配置數(shù)據(jù)庫(kù)連接、API 密鑰、路徑設(shè)置等參數(shù)。如果將這些信息直接寫在代碼里(硬編碼),會(huì)帶來(lái)極大的安全隱患和維護(hù)成本。常見(jiàn)的配置文件格式有 .ini, .json, .xml.yaml/.yml。

與其他格式相比,YAML 的優(yōu)勢(shì)在于:

  • 可讀性極高:采用清晰的縮進(jìn)結(jié)構(gòu),類似于 Python,即使非技術(shù)人員也能輕松理解。
  • 簡(jiǎn)潔的語(yǔ)法:不需要像 JSON 那樣充斥大量的括號(hào)和引號(hào),也不像 XML 那樣冗余。
  • 強(qiáng)大的功能:支持注釋、引用、復(fù)雜數(shù)據(jù)類型(列表、字典),甚至可以實(shí)現(xiàn)數(shù)據(jù)序列化。
  • 語(yǔ)言無(wú)關(guān):作為一種數(shù)據(jù)格式,它被多種編程語(yǔ)言廣泛支持。

它特別適合用于:配置文件、數(shù)據(jù)序列化、持續(xù)集成/部署 (CI/CD) 管道(如 GitHub Actions, Docker Compose, Kubernetes)。

2. YAML 基礎(chǔ)語(yǔ)法

YAML 的核心思想是使用縮進(jìn)來(lái)表示層級(jí)關(guān)系,禁止使用 Tab 鍵,只能使用空格。

2.1 基本數(shù)據(jù)類型

# 字符串 (通常不需要引號(hào),除非有特殊字符)
name: John Doe
company: "CSDN & Co." # 包含特殊字符&,建議加引號(hào)
title: This is a title

# 數(shù)字
age: 29
score: 89.5

# 布爾值
is_active: true  # 或 True, TRUE
is_admin: false  # 或 False, FALSE

# 空值
salary: null     # 或 Null, NULL, ~

# 日期和時(shí)間
date: 2023-10-27
datetime: 2023-10-27T15:30:00+08:00

2.2 復(fù)合數(shù)據(jù)類型

列表 (List/Array)

使用短橫線 - 加一個(gè)空格來(lái)表示列表項(xiàng)。

fruits:
  - Apple
  - Banana
  - Orange

# 行內(nèi)寫法 (類似JSON數(shù)組)
colors: [red, blue, green]

字典 (Map/Dictionary)

使用 key: value 的形式表示。

person:
  name: Alice
  age: 25
  address: Beijing

# 行內(nèi)寫法 (類似JSON對(duì)象)
coordinates: { x: 12.5, y: -7.2 }

2.3 復(fù)雜結(jié)構(gòu)嵌套

列表和字典可以自由組合,形成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

# 一個(gè)列表中包含多個(gè)字典
users:
  - name: John
    id: 1
    hobbies:
      - reading
      - hiking
  - name: Jane
    id: 2
    hobbies:
      - gaming
      - cooking

# 一個(gè)字典中某個(gè)值是列表
server:
  ip: 192.168.1.1
  ports:
    - 80
    - 443
    - 8080

2.4 高級(jí)特性(可選)

YAML 還支持一些高級(jí)特性,如錨點(diǎn) &別名 * 用于復(fù)用代碼塊,以及多行字符串。

# 錨點(diǎn)(&)和別名(*) - 避免重復(fù)
defaults: &defaults
  adapter: postgres
  host: localhost

development:
  <<: *defaults  # 合并defaults的內(nèi)容
  database: dev_db

test:
  <<: *defaults
  database: test_db

# 多行字符串
description: |
  This is a long text
  that spans multiple
  lines.           # 保留換行符

signature: >
  This will fold
  into a single
  line.            # 將換行折疊為空格

3. Python 操作 YAML 文件

Python 操作 YAML 文件主要使用第三方庫(kù) PyYAML。

3.1 安裝 PyYAML

通過(guò) pip 即可安裝:

pip install pyyaml

3.2 讀取 YAML 文件 (yaml.safe_load())

假設(shè)我們有一個(gè) config.yml 文件:

# config.yml
database:
  host: localhost
  port: 3306
  username: admin
  password: secret123
  db_name: my_app

logging:
  level: INFO
  file: /var/log/my_app.log
  rotation: 5

features:
  enable_upload: true
  allowed_file_types:
    - .jpg
    - .png
    - .pdf

在 Python 中讀取這個(gè)文件:

import yaml
import pathlib

# 推薦使用 pathlib 處理路徑
config_path = pathlib.Path('config.yml')

# 使用 safe_load() 而不是 load() 以避免安全風(fēng)險(xiǎn)!
with config_path.open('r', encoding='utf-8') as f:
    config_data = yaml.safe_load(f)

# 現(xiàn)在可以像操作普通字典一樣訪問(wèn)配置
print(config_data['database']['host'])  # 輸出: localhost
print(config_data['features']['enable_upload'])  # 輸出: True

# 獲取日志配置
log_level = config_data['logging']['level']
print(f"日志級(jí)別是: {log_level}")

3.3 寫入 YAML 文件 (yaml.safe_dump())

將 Python 對(duì)象(字典、列表)寫回 YAML 文件。

import yaml

# 要寫入的 Python 數(shù)據(jù)
data_to_write = {
    'project': 'Awesome Project',
    'author': 'CSDN Blogger',
    'tags': ['python', 'tutorial', 'yaml'],
    'config': {
        'timeout': 30,
        'retries': 3
    }
}

# 寫入文件
with open('output.yml', 'w', encoding='utf-8') as f:
    # safe_dump() 同樣比 dump() 更安全
    # allow_unicode: 確保中文等字符正確顯示
    # indent: 指定縮進(jìn)空格數(shù),讓文件更美觀
    yaml.safe_dump(
        data_to_write,
        f,
        allow_unicode=True,
        indent=2 # 可選,使用2空格縮進(jìn),更美觀
    )

# 也可以直接生成一個(gè)YAML字符串
yaml_string = yaml.safe_dump(data_to_write, allow_unicode=True)
print(yaml_string)

運(yùn)行后生成的 output.yml 文件內(nèi)容如下:

author: CSDN Blogger
config:
  retries: 3
  timeout: 30
project: Awesome Project
tags:
- python
- tutorial
- yaml

4. 實(shí)戰(zhàn):一個(gè)完整的配置管理示例

讓我們創(chuàng)建一個(gè)更實(shí)際的例子,模擬一個(gè)應(yīng)用的配置加載過(guò)程。

項(xiàng)目結(jié)構(gòu):

my_app/
├── config.yml
└── app.py

1. 創(chuàng)建配置文件 config.yml

# config.yml
app:
  name: My Python Application
  version: 1.0.0
  environment: development # production / staging

database:
  url: mysql+pymysql://user:pass@localhost:3306/dev_db
  pool_size: 5
  echo_sql: false

api:
  endpoint: https://api.example.com/v1
  timeout_seconds: 10
  retries: 2
  api_key: YOUR_API_KEY_HERE # 切記不要在代碼中提交真實(shí)密鑰!

logging:
  level: DEBUG
  format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

2. 創(chuàng)建主程序 app.py

# app.py
import yaml
import pathlib
import logging
from typing import Dict, Any

def load_config(config_file: pathlib.Path) -> Dict[str, Any]:
    """加載YAML配置文件"""
    if not config_file.exists():
        raise FileNotFoundError(f"配置文件 {config_file} 未找到!")
    
    with config_file.open('r', encoding='utf-8') as f:
        config = yaml.safe_load(f)
    return config

def setup_logging(logging_config: Dict[str, Any]):
    """根據(jù)配置設(shè)置日志"""
    logging.basicConfig(
        level=getattr(logging, logging_config['level']),
        format=logging_config['format']
    )
    logging.info("日志系統(tǒng)初始化成功!")

def main():
    # 1. 加載配置
    try:
        config = load_config(pathlib.Path('config.yml'))
    except Exception as e:
        print(f"加載配置失敗: {e}")
        return

    # 2. 讀取應(yīng)用配置
    app_config = config['app']
    print(f"啟動(dòng)應(yīng)用: {app_config['name']} (版本: {app_config['version']})")

    # 3. 設(shè)置日志
    setup_logging(config['logging'])

    # 4. 模擬使用其他配置
    db_url = config['database']['url']
    api_endpoint = config['api']['endpoint']
    # ... 這里可以繼續(xù)初始化數(shù)據(jù)庫(kù)連接、API客戶端等 ...

    logging.debug(f"數(shù)據(jù)庫(kù)URL: {db_url}")
    logging.info(f"API端點(diǎn): {api_endpoint}")
    logging.warning("這是一個(gè)警告信息!")
    print("應(yīng)用初始化完成,開(kāi)始運(yùn)行...")

if __name__ == "__main__":
    main()

運(yùn)行結(jié)果:

啟動(dòng)應(yīng)用: My Python Application (版本: 1.0.0)
應(yīng)用初始化完成,開(kāi)始運(yùn)行...

同時(shí),在日志中你會(huì)看到相應(yīng)的調(diào)試和信息輸出。

5. 安全警告與最佳實(shí)踐

  1. 始終使用 safe_load() 和 safe_dump()
    yaml.load()yaml.dump() 功能強(qiáng)大,但可以執(zhí)行任意 Python 代碼,如果加載來(lái)自不可信源的 YAML 文件,會(huì)帶來(lái)嚴(yán)重的代碼注入安全風(fēng)險(xiǎn)safe_load()safe_dump() 將其限制為僅加載標(biāo)準(zhǔn)的 YAML 標(biāo)簽,因此是絕對(duì)安全的選擇。

  2. 敏感信息處理
    永遠(yuǎn)不要將真正的密碼、API 密鑰等敏感信息直接提交到代碼倉(cāng)庫(kù)。應(yīng)該:

  3. 配置默認(rèn)值和驗(yàn)證
    對(duì)于可選的配置項(xiàng),應(yīng)在代碼中提供合理的默認(rèn)值。可以使用像 Pydanticmarshmallow 這樣的庫(kù)來(lái)驗(yàn)證加載的配置數(shù)據(jù)結(jié)構(gòu)是否正確,避免缺少必要的配置項(xiàng)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。

6. 常見(jiàn)錯(cuò)誤

  1. 一個(gè)從老版本轉(zhuǎn)換為新版本時(shí)會(huì)遇到的問(wèn)題:TypeError: load() missing 1 required positional argument: 'Loader' in Google Colab

    解決方案:將load()改為safe_load()1
  1. python - TypeError: load() missing 1 required positional argument: ‘Loader’ in Google Colab - Stack Overflow ??

總結(jié)

到此這篇關(guān)于Python yaml格式配置文件操作實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python yaml格式配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python接入使用百度翻譯流程

    python接入使用百度翻譯流程

    這篇文章主要介紹了利用Python接入百度翻譯的實(shí)現(xiàn)方法,從而實(shí)現(xiàn)中英文互譯的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-07-07
  • 基于Python工具使用Web3.py以太坊智能合約開(kāi)發(fā)的方法

    基于Python工具使用Web3.py以太坊智能合約開(kāi)發(fā)的方法

    智能合約是區(qū)塊鏈技術(shù)的核心應(yīng)用之一,它允許在沒(méi)有中介的情況下,通過(guò)代碼自動(dòng)執(zhí)行合同條款,以太坊是目前最流行的智能合約平臺(tái)之一,而Web3.py是用于與以太坊區(qū)塊鏈交互的Python庫(kù),本文將詳細(xì)介紹如何使用Web3.py進(jìn)行以太坊智能合約的開(kāi)發(fā),需要的朋友可以參考下
    2024-11-11
  • python numpy查詢定位賦值數(shù)值所在行列

    python numpy查詢定位賦值數(shù)值所在行列

    這篇文章主要介紹了python numpy查詢定位賦值數(shù)值所在行列,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 在Mac OS上部署Nginx和FastCGI以及Flask框架的教程

    在Mac OS上部署Nginx和FastCGI以及Flask框架的教程

    這篇文章主要介紹了在Mac OS上部署Nginx和FastCGI以及Flask框架的教程,Flask是Python下一個(gè)極簡(jiǎn)的web開(kāi)放框架,需要的朋友可以參考下
    2015-05-05
  • Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    這篇文章主要介紹了Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Python設(shè)計(jì)模式之工廠模式簡(jiǎn)單示例

    Python設(shè)計(jì)模式之工廠模式簡(jiǎn)單示例

    這篇文章主要介紹了Python設(shè)計(jì)模式之工廠模式,簡(jiǎn)單說(shuō)明了工廠模式的原理,并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)工廠模式的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • PyCharm利用pydevd-pycharm實(shí)現(xiàn)Python遠(yuǎn)程調(diào)試的詳細(xì)過(guò)程

    PyCharm利用pydevd-pycharm實(shí)現(xiàn)Python遠(yuǎn)程調(diào)試的詳細(xì)過(guò)程

    這篇文章主要介紹了PyCharm利用pydevd-pycharm實(shí)現(xiàn)Python遠(yuǎn)程調(diào)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • python基于tkinter圖形化編程實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能

    python基于tkinter圖形化編程實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了python基于tkinter圖形化編程實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • python-docx文檔格式修改方式

    python-docx文檔格式修改方式

    使用python-docx庫(kù)修改docx文檔格式的兩種方法:第一種是通過(guò)自定義函數(shù)設(shè)置段落和字體樣式,第二種是預(yù)設(shè)Word中的樣式后通過(guò)代碼替換文檔整體樣式。這兩種方式各有優(yōu)缺點(diǎn),第一種方法更靈活,而第二種方法可以更全面地保留格式細(xì)節(jié)
    2024-09-09
  • NumPy-ndarray 的數(shù)據(jù)類型用法說(shuō)明

    NumPy-ndarray 的數(shù)據(jù)類型用法說(shuō)明

    這篇文章主要介紹了NumPy-ndarray 的數(shù)據(jù)類型用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論

潜山县| 威海市| 宿松县| 九江县| 增城市| 桐梓县| 新兴县| 上高县| 视频| 成安县| 阿克陶县| 姜堰市| 方山县| 英山县| 江阴市| 布尔津县| 大新县| 青州市| 荔浦县| 云南省| 阿坝| 柞水县| 正阳县| 民丰县| 新宁县| 兴和县| 常宁市| 大安市| 枣强县| 唐海县| 那曲县| 石景山区| 怀仁县| 久治县| 漯河市| 四川省| 罗城| 南丰县| 嘉祥县| 海城市| 松桃|