Python Pyyaml:修改aws-auth-cm.yaml,保留多行字符串

Python Pyyaml:修改aws-auth-cm.yaml,保留多行字符串,python,yaml,pyyaml,Python,Yaml,Pyyaml,我正在尝试用python加载一个YAML文件,修改它并将其转储回。 YAML如下所示: data: mapRoles: | - username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes kind: ConfigMap metadata: name: aws-auth namespace: kube-system 我想修

我正在尝试用python加载一个YAML文件,修改它并将其转储回。 YAML如下所示:

data:
  mapRoles: |
    - username: system:node:{{EC2PrivateDNSName}}
      groups:
      - system:bootstrappers
      - system:nodes
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
我想修改它,以便输出文件在mapRoles:

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": |

是否有一种方法可以将样式=“|”仅应用于字符串,并确保键没有被引用?

您可以尝试使用PyYAML执行此操作,但需要加载块样式文字标量 (这就是用
|
表示的这种多行结构的名称)在 字符串的子类,请确保可以修改它,然后在转储时使用特殊的representer 对于再次作为文本标量转储的子类

实现这一点的简单方法是从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
请注意,我通过使用
+=
更改 从文本标量加载的“字符串”。我在这本书上加了一句新词 添加的字符串的结尾,否则您的文字标量将 与
|-
一起引入,
-
作为指示符号
剥离。

您的原始文件无效,因为
-
|
结尾的行需要缩进后,我认为这是一个拼写错误,并更正了它。哦,这非常好用!谢谢。