YAML:dump_all 保存一个空文件

YAML: dump_all saves an empty file

我正在尝试打开一个 yaml 文件,更新一个值并保存它。我已经按照 Whosebug 上已经提供的许多示例进行操作,但它仍然不起作用。

我的代码: 导入 yaml

def update(x:int):
    with open("fileWithValues.yaml", "r") as yaml_file:
        try:
            docs=yaml.load_all(yaml_file, Loader=yaml.SafeLoader)
            for doc in docs:
                for key, value in doc.items():
                    if value == "city":
                        doc["year"]["value"] = x
                        break

            with open("fileWithValues.yaml", 'w') as yaml_file:
                yaml.dump_all(docs, yaml_file, default_flow_style=False)
        except yaml.YAMLError as exc:
            print(exc)

如前所述,为了创建代码,我遵循了 Whosebug 中的几个示例。但是,在执行代码之后,它似乎正在打开要写入的文件,但它仍然是空的。总而言之,我阅读文件的第一部分有效。它应该转储所有文件的部分没有。它不会抛出任何异常或错误消息。它只是保存一个空文件。

附加信息:我正在阅读的文件包含两个文档。而我更新的值在第二个。

更新:用于获取第一个数据的示例文件

---
apiVersion: v1
kind: Service
metadata:
  name: aa
  labels:
    app: aa
    service: aa
spec:
  selector:
    app: aa
  ports:
  - name: tcp-send
    port: 9000
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: capture-v1
  labels:
    app: aa
    version: v1
spec:
  replicas: 5
  selector:
    matchLabels:
      app: aa
      version: v1
  template:
    metadata:
      labels:
        app: aa
        version: v1
    spec:
      containers:
      - name: aa
        image: someimage:0.3
        ports:
          - name: tcp-send
            containerPort: 9000
        volumeMounts:
        - name: bb-aa
          mountPath: /etc/localtime
      volumes:
        - name: bb-aa
          hostPath:
            path: /path/
      nodeSelector:
        kubernetes.io/hostname: serve3
...   

要更改的目标参数是:第二个文档,规范,replicas

您的 with 语句是嵌套的,因此您正在以写入模式打开文件,而文件已经以读取模式打开。像这样分开它们:

def update(x:int):
    try:
        with open("fileWithValues.yaml", "r") as yaml_file:
            docs = list(yaml.load_all(yaml_file, Loader=yaml.SafeLoader))
        for doc in docs:
            for key, value in doc.items():
                if value == "city":
                    doc["year"]["value"] = x
                    break

        with open("fileWithValues.yaml", 'w') as yaml_file:
            yaml.dump_all(docs, yaml_file, default_flow_style=False)
    except yaml.YAMLError as exc:
        print(exc)