为什么我的循环在我的 YAML 文件末尾添加了一个额外的键值对?

安焦拉

我有两个单独的 YAML 文件,我正在使用ruamel.yaml.

文件一:

---
value: 600
another_value: 330
main_config::config::config:
  username:
    password: 'ENCRYPTED_PASSWORD'
    name: 'John Doe'
    role: 'admin'
    expiration: '2055-01-01'
    email: '[email protected]'

和 File_two:

---
main_config::config::config:
  username:
    password: 'ENCRYPTED_PASSWORD'
    name: 'John Doe'
    role: 'admin'
    expiration: '2055-01-01'
    email: '[email protected]'
another_config::config:
  setting1:
    setting2:
      setting3:
        setting4: false

我正在使用 raumel 解析文件并更新到期日期,同时保留整个文件。但是,它似乎在 File_one 中有效,但在 file_two 中无效。

File_two 不仅会更新过期日期,还会在文件末尾添加一个额外的过期日期,如下所示:

---
main_config::config::config:
  username:
    password: 'ENCRYPTED_PASSWORD'
    name: 'John Doe'
    role: 'admin'
    expiration: '2055-01-01'
    email: '[email protected]'
another_config::config:
  setting1:
    setting2:
      setting3:
        setting4: false
    expiration: '2055-01-01'

我正在使用的代码片段是:

with open(f"./path/to/file.yaml", 'r') as f:
    file = yaml.load(f)

    for k, v in file.items():
        if isinstance(v, dict):
            for x, y in v.items():
                if isinstance(y, dict):
                    y['expiration'] = DATE
    # Write new expiration date to file in CM:
    with open(f"./path/to/file.yaml", "w") as edit_file:
        yaml.dump(file, edit_file)

为什么使用相同代码的两个文件的输出不同?

安东尼

File_one在根级别只有一个键,其具有 dict 作为值,并且到期日期会在其中更新。File_two在根级别有两个键,它们具有 dict 作为值,并且它们都得到更新。因为输入不同,并且在第二个 YAML 示例中触发了两次“更新过期”代码段,所以输出不同。这通常是正确的:如果代码的行为依赖于处理的数据,则不同输入的输出可能会有所不同,尽管代码是相同的。

您可以在更新它之前添加一个额外的测试以查看是否expiration是字典中的键(即,如果它不存在,您将永远不会添加它:

            if isinstance(y, dict) and 'expiration' in y:

,或者如果您总是想将过期键添加到找到的第一个字典,则可以退出:

            if isinstance(y, dict):
                y['expiration'] = DATE
                break

有问题的是您的代码在打开文件仍在读取时写入它。您可以将最后两行移到初始with语句之外,但我建议使用pathlib.Path它将正确打开文件作为二进制文件(需要转储为 UTF-8):

from pathlib import Path
yaml_file = Path('./path/to.file.yaml')
data = yaml.load(yaml_file)

for k, v in file.items():
    if isinstance(v, dict):
        for x, y in v.items():
            if isinstance(y, dict):
                y['expiration'] = DATE
                break

# Write new expiration date to file in CM:
yaml.dump(file, yaml_file)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的while循环只迭代一次?

MongoDB文档说我的配置文件应该是YAML。不是。为什么?

为什么在我的整个.csv文件转换为.yaml文件之前,我必须运行几次此代码?

为什么我在每个循环中只添加最后一个元素?

为什么我的for循环在列表末尾返回一个空列表值?

什么是代表我的Yaml文件的更好方法

为什么我的for循环只返回1个值

为什么我的for循环出现46个错误?

为什么我的for循环在R中运行一个额外的迭代?

为什么我的LinkedList在列表末尾读取一个额外的节点?

Python,为什么我的for循环在创建一个docx文件时会创建两个?

为什么即使添加了多个节点,我的链表也只包含一个节点?

为什么我的for循环来一次?

为什么我的.bat文件进行无限循环?

为什么我的for循环找不到任何文件?

为什么我的循环只运行一次?

为什么FFmpeg会在我的文件中添加第二个字幕,即使我明确只添加了一个字幕呢?

为什么我的循环只运行一次?

为什么在我的Linux内核中的/ dev下添加了一个额外的HDD?

为什么我的“为什么”循环中的“如果”语句不能更改我的一个对象?

为什么我的 for 循环似乎只运行一次?

为什么我似乎陷入了一个循环?

为什么我不能解析我的简单 YAML 文件而不产生错误“此处不允许映射值”?

尽管使用 copts 添加了一个额外的包含目录,为什么 Bazel 没有找到我的包含文件?

为什么我的循环会创建额外的链表节点?

为什么我的 For Each 循环只迭代一次?

为什么它给了我一个额外的词?

为什么我的 Node.js api 识别出来自 MongoDb 的重复用户,但仍然添加了一个额外的用户?

我有一个无限的 while 循环,但我不明白为什么