如何解决Python 更新 YAML 而不更改格式
我想更新 yaml 文件中的特定属性,同时保持其余属性不变,包括格式、注释等。我正在使用 raumel.yaml。但是当我保存文件时,它的格式被弄乱了。我使用的是 python 3.9.5 和 raumel.yaml 版本:0.17.10。
test.yaml
:
sso:
version: 1.0.0
configs:
- configName: config1.conf
fileContent: 'startDelaySeconds: 0
lowercaSEOutputName: true
lowercaSEOutputLabelNames: false
whitelistObjectNames: [''org.apache.commons.pool2:*'']
blacklistObjectNames: []
rules:
- pattern: ".*"
'
我更新了版本:
from ruamel.yaml import YAML
yaml = YAML()
with open('test.yaml') as f:
test = yaml.load(f)
test['sso']['version'] = '1.0.1'
with open('test2.yaml','w') as f:
yaml.dump(test,f)
但是保存文件的 fileContent
在格式上发生了变化(换行符替换为 \n
等)。 test2.yaml
:
sso:
version: 1.0.1
configs:
- configName: config1.conf
fileContent: "startDelaySeconds: 0\nlowercaSEOutputName: true\nlowercaSEOutputLabelNames:\
\ false\nwhitelistObjectNames: ['org.apache.commons.pool2:*']\nblacklistObjectNames:\
\ []\nrules:\n- pattern: \".*\"\n"
解决方法
您可能错过的是值中的引号
为您的输出从单引号更改为双引号。默认情况下 ruamel.yaml
不尝试保留引号,从而能够删除任何多余的
引号,或者在这种情况下使用更紧凑的表示。
使用在标量中不需要单引号的双引号
被复制。
您可以通过设置 .preserve_quotes
属性来保留引号:
import sys
from ruamel.yaml import YAML
yaml = YAML()
yaml.preserve_quotes = True
with open('test.yaml') as f:
test = yaml.load(f)
test['sso']['version'] = '1.0.1'
yaml.dump(test,sys.stdout)
给出:
sso:
version: 1.0.1
configs:
- configName: config1.conf
fileContent: 'startDelaySeconds: 0
lowercaseOutputName: true
lowercaseOutputLabelNames: false
whitelistObjectNames: [''org.apache.commons.pool2:*'']
blacklistObjectNames: []
rules:
- pattern: ".*"
'
我建议考虑对值使用文字样式标量 包含换行符的,因为在那些你不需要加倍换行符的情况下, 也不需要在标量中加双单引号:
yaml_str = """
sso:
version: 1.0.0
configs:
- configName: config1.conf
fileContent: |
startDelaySeconds: 0
lowercaseOutputName: true
lowercaseOutputLabelNames: false
whitelistObjectNames: ['org.apache.commons.pool2:*']
blacklistObjectNames: []
rules:
- pattern: ".*"
"""
import sys
from ruamel.yaml import YAML
yaml = YAML()
yaml.preserve_quotes = True
with open('test.yaml') as f:
test = yaml.load(f)
data = yaml.load(yaml_str)
assert data['sso']['configs'][0]['fileContent'] == test['sso']['configs'][0]['fileContent']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。