关于python使用ruamel.yaml.dump写出的yaml文件注释丢失的原因?
新手小白自学python一星期,有被困扰到,烦请熟悉这方面踩过坑的大神指点迷津,感激不尽!
这是我的docker-compose1.yml文件
version: "3"
services:
#xxx-service
xxx-service:
#测试0
image: 192.168.0.0/xxx-service:v1.1.0
restart: always
#测试1
hostname: xxx-service
ports:
#测试2
#6379: 6379
volumes:
# 日志数据
- /var/log/ABC/docker/xxx-service/logs:/logs
# 拓扑导出导入配置文件
- /etc/ABC/topology-templates:/etc/ABC/xxx/config/topology
environment:
#测试3
SPRING_REDIS_HOST: redis
#测试4
SPRING_REDIS_DATABASE: 1
#测试5
我的python代码,python版本3.7.1
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
from ruamel import yaml
def up_yml():
#读取docker-compose.yml文件
with open('./docker-compose1.yml', 'r+', encoding="utf-8") as f:
content = yaml.load(f, Loader=yaml.RoundTripLoader)
#写入docker-compose.yml文件
with open('./docker-compose2.yml', 'w+', encoding="utf-8") as nf:
yaml.dump(content, nf,Dumper=yaml.RoundTripDumper,default_flow_style=False, allow_unicode=True, indent=2, block_seq_indent=2)
if __name__ == '__main__':
up_yml()
期待得到输出
version: "3"
services:
#xxx-service
xxx-service:
#测试0
image: 192.168.0.0/xxx-service:v1.1.0
restart: always
#测试1
hostname: xxx-service
ports:
#测试2
#6379: 6379
volumes:
# 日志数据
- /var/log/ABC/docker/xxx-service/logs:/logs
# 拓扑导出导入配置文件
- /etc/ABC/topology-templates:/etc/ABC/xxx/config/topology
environment:
#测试3
SPRING_REDIS_HOST: redis
#测试4
SPRING_REDIS_DATABASE: 1
#测试5
实际的输出
version: "3"
services:
#xxx-service
xxx-service:
#测试0
image: 192.168.0.0/xxx-service:v1.1.0
restart: always
hostname: xxx-service
ports:
volumes:
# 日志数据
- /var/log/ABC/docker/xxx-service/logs:/logs
# 拓扑导出导入配置文件
- /etc/ABC/topology-templates:/etc/ABC/xxx/config/topology
environment:
#测试3
SPRING_REDIS_HOST: redis
SPRING_REDIS_DATABASE: 1
请问这是为什么?除了开头的那个#测试0的注释和vloumes里的注释保留,其他的丢失
我发现image、networks等同一级但是在xxx-service下的注释,仅有xxx-service下紧接着的注释能保留,其他的会丢失
请问有办法解决吗?网上看了很多帖子,几乎都是复制粘贴的同样内容,他们对于注释丢失的解决办法是使用:
ruamel.yaml.load(Loader=ruamel.yaml.RoundTripLoader)
ruamel.yaml.dump(Dumper=ruamel.yaml.RoundTripDumper)
推荐文章: