【问题标题】:YAML: dump_all saves an empty fileYAML:dump_all 保存一个空文件
【发布时间】:2021-12-28 08:18:22
【问题描述】:

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

我的代码: 导入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)

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

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

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

---
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
...   

要更改的目标参数是:2nd document, spec, replicas

【问题讨论】:

    标签: python python-3.x yaml


    【解决方案1】:

    您的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)
    

    【讨论】:

    • 嗯,你的提议是有道理的,但它会导致ValueError: I/O operation on closed file.
    • @WestCoast 我明白了,显然文件是延迟加载的。我已经更新了我的答案,请尝试稍微不同的缩进
    • 错误消失了,但它仍在保存一个空文件...相当混乱,它应该可以工作:(
    • 我用示例文件更新了我的问题。也许这有帮助
    • @WestCoast 您可以通过在生成器上调用list() 来急切地加载所有文档,请参阅我的更新答案。但是,您的示例数据实际上并未更新,因为条件永远不会为真。
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多