文章目錄
- 安裝
- 基本使用
- 1. 讀取 YAML
- 2. 寫入 YAML
- 3. 讀取 → 修改 → 保留格式寫回(典型用例)
- 配置選項
- 與 PyYAML 的對比
- 高級用法:Round-trip 模式(推薦用於配置編輯)
- 示例:帶註釋的 YAML 文件處理
- 總結
ruamel.yaml 是一個功能強大且廣泛使用的 Python 庫,用於處理 YAML(YAML Ain’t Markup Language)格式的數據。它是 PyYAML 的一個增強分支,由 Anthon van der Neut 維護,主要優勢在於:
- 保留原始 YAML 文件的格式(包括註釋、縮進、順序等);
- 支持 YAML 1.2 規範(比 PyYAML 默認支持的 YAML 1.1 更現代);
- 提供更靈活的 API,適用於讀取、修改並寫回 YAML 文件的場景(如配置文件編輯)。
安裝
pip install ruamel.yaml
基本使用
1. 讀取 YAML
from ruamel.yaml import YAML
yaml = YAML()
with open('config.yaml') as f:
data = yaml.load(f)
print(data)
2. 寫入 YAML
from ruamel.yaml import YAML
yaml = YAML()
data = {'name': 'Alice', 'age': 30, 'active': True}
with open('output.yaml', 'w') as f:
yaml.dump(data, f)
3. 讀取 → 修改 → 保留格式寫回(典型用例)
這是 ruamel.yaml 最突出的能力:修改 YAML 文件但保留註釋和結構。
from ruamel.yaml import YAML
yaml = YAML()
with open('config.yaml') as f:
config = yaml.load(f)
# 修改內容
config['database']['port'] = 5433
# 寫回(保留原有註釋、縮進等)
with open('config.yaml', 'w') as f:
yaml.dump(config, f)
注意:必須使用
ruamel.yaml.YAML()實例(而不是yaml.load/dump函數),才能保留格式。
配置選項
YAML 對象支持多種配置:
yaml = YAML()
yaml.indent(mapping=2, sequence=4, offset=2) # 控制縮進
yaml.preserve_quotes = True # 保留字符串引號
yaml.width = 100 # 行寬限制
yaml.explicit_start = True # 添加 --- 開頭
yaml.explicit_end = True # 添加 ... 結尾
與 PyYAML 的對比
|
特性
|
|
|
|
保留註釋
|
✅ 是
|
❌ 否
|
|
保留鍵順序
|
✅(默認 dict 有序)
|
✅(Python 3.7+)
|
|
支持 YAML 1.2
|
✅
|
❌(僅 1.1)
|
|
安全加載(防任意代碼)
|
✅(默認安全)
|
❌( |
|
性能
|
稍慢
|
稍快
|
ruamel.yaml默認使用安全加載,無需擔心!!python/object等反序列化風險。
高級用法:Round-trip 模式(推薦用於配置編輯)
ruamel.yaml 默認使用 round-trip loader/dumper,專門用於“讀-改-寫”場景:
from ruamel.yaml import YAML
yaml = YAML(typ='rt') # 'rt' = round-trip(默認值)
該模式會保留:
- 註釋(行內和行間)
- 鍵的順序
- 空行
- 縮進風格
- 字符串樣式(單引號、雙引號、無引號)
示例:帶註釋的 YAML 文件處理
原始 app.yaml:
# 應用配置
app:
name: myapp
version: 1.0 # 當前版本
debug: false
Python 代碼:
from ruamel.yaml import YAML
yaml = YAML()
with open('app.yaml') as f:
cfg = yaml.load(f)
cfg['app']['version'] = '1.1'
cfg['app']['debug'] = True
with open('app.yaml', 'w') as f:
yaml.dump(cfg, f)
輸出仍保留註釋:
# 應用配置
app:
name: myapp
version: 1.1 # 當前版本
debug: true
總結
- 如果你只是讀取或生成 YAML,
PyYAML足夠; - 如果你需要編輯現有 YAML 文件並保留格式/註釋(如配置管理工具),強烈推薦
ruamel.yaml; - 它是 DevOps 工具、CI/CD 腳本、配置生成器等場景的理想選擇。