我正在尝试在python中加载YAML文件,对其进行修改并将其转储回去。 YAML看起来像这样:
data:
mapRoles: |
- username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
我想对其进行修改,以使输出文件在mapRoles中包含新行rolearn: awsarn
:
data:
mapRoles: |
- username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
rolearn: awsarn
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
但是我得到的输出是mapRoles值像字符串一样被引用,并包含文字\n
:
apiVersion: v1
data:
mapRoles: "- username: system:node:{{EC2PrivateDNSName}}\n groups:\n - system:bootstrappers\n\
\ - system:nodes\n rolearn: arnaws"
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
我正在使用的代码:
with open ('/tmp/aws-auth-cm.yaml') as f:
content = yaml.safe_load(f)
content['data']['mapRoles'] = content['data']['mapRoles'] + ' rolearn: awsarn'
with open("/tmp/aws-auth-cm.yaml", "w") as f:
yaml.safe_dump(content, f, default_flow_style=False)
我也尝试使用yaml.safe_dump(content, f, default_flow_style=False, default_style='|')
,然后所有值都有|-,并且键用双引号引起来:
"apiVersion": |-
v1
"data":
"mapRoles": |-
- username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
rolearn: arnaws
"kind": |-
ConfigMap
"metadata":
"name": |
有没有一种方法可以应用style ='|'只是要确保字符串不正确,而且还要确保没有引号?
答案 0 :(得分:1)
您可以尝试使用PyYAML进行此操作,但是您需要加载块样式文字标量
(即称为|
的多行构造)
字符串的子类,请确保您可以对其进行修改,然后在转储时使用特殊的表示符
再次将其转储为文字标量的子类。
最简单的方法是从PyYAML升级到
ruamel.yaml
(免责声明:我是该程序包的作者),不仅保留
文字块还支持更新的YAML 1.2规范(于2009年发布),
保留注释和标签,整数和浮点格式以及(可选)多余的引号:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
with open('aws-auth-cm.yaml') as f:
content = yaml.load(f)
content['data']['mapRoles'] += ' rolearn: awsarn\n'
with open('aws-auth-cm.yaml', 'w') as f:
yaml.dump(content, f)
给出:
data:
mapRoles: |
- username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
rolearn: awsarn
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
请注意,我通过使用+=
更改了
从文字标量加载的“字符串”。我在其中添加了换行符
添加字符串的末尾,因为否则您的文字标量将是
以|-
开头,-
是block chomping
operator,表示
剥离。