Python使用ruamel.yaml修改YAML文件及保持格式技巧

认真发呆
认真发呆
发布时间:2026-10-13| 1人浏览过
原创

本文介绍如何使用Python库ruamel.yaml读取、修改并写入YAML文件。通过具体代码示例展示如何更新docker-compose.yml中的参数。重点解决输入输出格式不一致问题,推荐使用RoundTripLoader和RoundTripDumper或round_trip_load/dump函数来保持原有YAML文件的缩进、注释和键值顺序,确保配置文件的可读性和一致性。

安装ruamel.yaml库

首先,需要安装ruamel.yaml库,执行命令:pip install ruamel.yaml。

修改YAML文件实例

该库主要用于修改现有的YAML配置文件。


#coding:utf-8
from ruamel import yaml

def up_yml(ip_server):
 with open('./../docker-compose-demo.yml', encoding="utf-8") as f:
  content = yaml.load(f, Loader=yaml.RoundTripLoader)
  # 修改yml文件中的参数
  content['service']['memo_query']['server_ip'][0] = 'mysql_host={}'.format(ip_server)
 with open('./../docker-compose.yml', 'w', encoding="utf-8") as nf:
  yaml.dump(content, nf, Dumper=yaml.RoundTripDumper)

if __name__ == '__main__':
 up_yml(ip_server='0.0.0.0')

以下是修改前的YAML文件内容示例:


version: '1'
service:
 memo_query:
 image: python:2.0
 restart: always
 server_ip:
 - mysql_host=192.168.1.1

修改后的YAML文件内容如下:


version: '1'
service:
 memo_query:
 image: python:2.0
 restart: always
 server_ip:
 - mysql_host=0.0.0.0

解决格式不一致问题

补充知识:解决Python中ruamel.yaml读写YAML文档时格式不一致的问题。

在使用ruamel.yaml的过程中,可能会发现输入和输出的格式存在差异。网上提供了一种有效的解决方案:

输入示例如下:


ChuaTony: 
 公司: 文传
 联络: 
 - 公司: '1422031030'
 - 手机: '18650144578'
 - 住家: '2233068479'
 住址: 
 - 公司: 褔建。
 - 住家: 台中。
 交通: 无
 附件: 
Tom: 
 公司: 天褔
 联络: 
 - 公司: '1422031030'
 - 手机: '18650123456'
 - 住家: '2233061234'
 住址: 
 - 公司: 褔建。
 - 住家: 台北。
 交通: 自行车
 附件: 

output:
ChuaTony:
 交通: 无
 住址:
 - 公司: 褔建。
 - 住家: 台中。
 公司: 文传
 联络:
 - 公司: '1422031030'
 - 手机: '18650144578'
 - 住家: '2233068479'
 附件: null
Tom:
 交通: 自行车
 住址:
 - 公司: 褔建。
 - 住家: 台北。
 公司: 天褔
 联络:
 - 公司: '963852741'
 - 手机: '18650123456'
 - 住家: '2233061234'
 附件: null

上述操作可能导致格式不一致。

可以通过以下方式解决:

在加载时使用 ruamel.yaml.load(Loader=ruamel.yaml.RoundTripLoader),在保存时使用 ruamel.yaml.dump(Dumper=ruamel.yaml.RoundTripDumper)。

或者,

直接使用 ruamel.yaml.round_trip_load() 和 ruamel.yaml.round_trip_dump() 函数。

这样可以有效解决格式不一致的问题。

修改后的完整代码如下:


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
' a YAML module '
 
__author__ = 'Chua Tony'
 
import ruamel.yaml
 
#开档
with open("人资.yaml", "r",encoding="utf-8") as docs:
	try:
		#alldata = ruamel.yaml.load(docs, Loader=ruamel.yaml.RoundTripLoader) #使用 Loader=ruamel.yaml.RoundTripLoader
		alldata = ruamel.yaml.round_trip_load(docs)
	except ruamel.yaml.YAMLError as exc:
		print(exc)
 
#印出
for data in alldata:
	print(alldata[data]['联络'])
 
#修改
alldata['Tom']['联络'][0]['公司']='963852741'
 
#写档
with open('人资1.yaml', 'w+', encoding='utf8') as outfile:
	#ruamel.yaml.dump(alldata, outfile, default_flow_style=False, allow_unicode=True, Dumper=ruamel.yaml.RoundTripDumper, indent=2, block_seq_indent=2) #使用 Dumper=ruamel.yaml.RoundTripDumper
	ruamel.yaml.round_trip_dump(alldata, outfile, default_flow_style=False, allow_unicode=True, indent=2, block_seq_indent=2) #indent:缩进 block_seq_indent:区块缩进

运行上述代码后的输出结果如下:


ChuaTony:
 公司: 文传
 联络:
 - 公司: '1422031030'
 - 手机: '18650144578'
 - 住家: '2233068479'
 住址:
 - 公司: 褔建。
 - 住家: 台中。
 交通: 无
 附件:
Tom:
 公司: 天褔
 联络:
 - 公司: '963852741'
 - 手机: '18650123456'
 - 住家: '2233061234'
 住址:
 - 公司: 褔建。
 - 住家: 台北。
 交通: 自行车
 附件:

至此,问题已解决。

以上关于Python读取YAML文件后修改并写入本地的实例分享完毕,希望能为读者提供参考,欢迎支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。