我有两个单独的 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] 删除。
我来说两句