Python使用ruamel.yaml修改YAML文件及保持格式技巧
本文介绍如何使用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文件后修改并写入本地的实例分享完毕,希望能为读者提供参考,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













