使用Python2(atm)和拉梅尔亚姆勒0.13.14(RedHat EPEL)
我目前正在编写一些代码来加载yaml定义,但是它们被分成多个文件。用户可编辑部分包含例如
users:
xxxx1:
timestamp: '2018-10-22 11:38:28.541810'
<< : *userdefaults
xxxx2:
<< : *userdefaults
timestamp: '2018-10-22 11:38:28.541810'
默认值存储在另一个不可编辑的文件中:
^{pr2}$我可以同时处理这些字符串,方法是加载并合并字符串,然后通过merged_data = list(yaml.load_all("{}\n{}".format(defaults_data, user_data), Loader=yaml.RoundTripLoader))
运行它们,这可以正确地解决所有问题。(当不使用RoundTripLoader时,我得到的错误是无法解析引用,这是正常的)
现在,我想通过python代码进行一些更新(例如更新时间戳),为此我只需要写回用户部分。这就是事情变得棘手的地方。我还没有找到一种方法来写yaml文档,不是两者都写。在
首先,除非默认文件中有多个文档,否则 不必使用
load_all
,因为您不需要将两个文档连接到 多文档流。如果你用一个带文档结尾的格式字符串 标记("{}\n...\n{}"
)或带有指令结束标记("{}\n -\n{}"
) 你的别名不会从一个文档传递到另一个文档 YAML规格:锚定必须在文档中,而不仅仅是在流中(流可以由多个 文件)。
我尝试了一些hocus pocus,预先填充已经呈现的字典 锚定节点数:
由于基于PyYAML的API需要一个类而不是一个对象,因此您需要 使用一个类生成器,它实际上添加了要预填充的数据元素 这只苍蝇来自于
yaml.load()
。但这不起作用,因为节点只有在锚定之后才能被写出 确定使用了锚点(即有第二个参考)。所以实际上 第一个合并键被写为锚。虽然我很熟悉 有了代码库,我无法在合理的时间内使其正常工作。
因此,我只能依赖于只有一个匹配的键 在组合更新的转储的根级别上
^{pr2}$users.yaml
的第一个键 在那之前把任何东西锉掉。它给出了:
我必须制作一个virtualenv来确保我可以用
ruamel.yaml==0.13.14
运行上面的内容。 这个版本是从我还年轻的时候开始的(我不会声称自己是无辜的)。 从那时起,这个库已经发行了超过85个版本。我能理解,你可能什么都不能做 Python2目前无法编译/使用更新的版本。但是什么 您真正应该做的是安装
virtualenv
(可以使用EPEL完成,但也可以不使用 进一步“污染”您的系统安装),为 您正在开发并安装最新版本的ruamel.yaml
(和 你的其他图书馆)在那里。你也可以这样做,如果你需要 要将软件分发到其他系统,只需在那里安装virtualenv。我把我所有的实用程序都放在} a
包装virtualenv。
/opt/util
下,并进行管理 ^{为了编写用户部分,您必须手动分割
yaml.dump()
多文件输出的输出,并将适当的部分写回用户yaml文件。相关问题 更多 >
编程相关推荐