您的代码信息量不是很大,因此很难看到您在做什么(或者可能做错了).默认情况下为ruamel.yaml
但是,往返模式将保留流样式/块样式以及块文字样式标量(由|
引入):
import sys
import ruamel.yaml
yaml_str = """\
abc:
- {uses: actions/checkout@v3}
- uses: actions/checkout@v3
- name: Register RepoDigests
run: |
sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
这提供了:
abc:
- {uses: actions/checkout@v3}
- uses: actions/checkout@v3
- name: Register RepoDigests
run: |
sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml
如果加到data
,则默认情况下将采用块样式(即不带大括号),除非您这样做了
yaml.default_flow_style = None # or True
您可以更改键run
的值(即sed命令行),但您必须小心.那
Value打印起来像一个字符串,行为也像一个字符串,例如你可以做一个.replace()
.但它
不是一个普通的Python字符串,而是一个ruamel.yaml.scalarstring.LiteralStyleScalar
,其类型
信息是用来将整个事物再次作为字面样式标量转储的东西.所以
如果为键run
指定新值,则可能需要"保留"该类型:
data = yaml.load(yaml_str)
data['abc'].append(dict(extra='read all about it'))
x = ruamel.yaml.comments.CommentedMap(some='more')
x.fa.set_flow_style() # fa for FlowAttribute
rundata = data['abc'][2]
lit_style = type(rundata['run'])
rundata['run'] = rundata['run'].replace('sha256', 'sha512')
rundata['post'] = lit_style('rm -f *.junk')
data['abc'].append(x)
yaml.dump(data, sys.stdout)
这提供了:
abc:
- {uses: actions/checkout@v3}
- uses: actions/checkout@v3
- name: Register RepoDigests
run: |
sed -i "/$IMAGE_NAME_FRONTEND@sha512/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml
post: |-
rm -f *.junk
- extra: read all about it
- {some: more}