在 PyYAML 中保存/转储带有注释的 YAML 文件

问题描述 投票:0回答:4

我有一个如下所示的 yaml 文件:

# The following key opens a door
key: value

有没有办法在维护评论的同时

load
dump
这些数据?

python yaml pyyaml
4个回答
116
投票

如果你使用块结构的 YAML,你可以使用 python 包¹ import sys import ruamel.yaml yaml_str = """\ # example name: # details family: Smith # very common given: Alice # one of the siblings """ yaml = ruamel.yaml.YAML() # defaults to round-trip if no parameters given code = yaml.load(yaml_str) code['name']['given'] = 'Bob' yaml.dump(code, sys.stdout) 结果:

# example name: # details family: Smith # very common given: Bob # one of the siblings

注意行尾注释仍然对齐。

而不是普通的
list

dict

对象,

code

由包装版本²组成,上面附有评论。
¹ 
使用
pip install ruamel.yaml
安装。适用于 Python 2.6/2.7/3.3+

²

ordereddict
在映射的情况下使用,以保留顺序
PyYAML 在非常低的级别(在 
Scanner.scan_to_next_token

中)丢弃注释。

31
投票
虽然您可以调整或扩展它以处理整个堆栈中的评论,但这将是一个重大修改。

Dump

ing(=发出)评论似乎更容易,并且在旧 PyYAML 错误跟踪器上的 
ticket 114

中进行了讨论。

截至 2023 年,关于添加对加载评论的支持的
功能请求仍然停滞不前。

我有一个 pyyaml 的分支就是这样做的。 https://github.com/pflarr/pyyaml


5
投票
要构建带有评论的 yaml 文件,您必须创建一个包含评论事件的事件流。目前只允许在序列项和映射键之前进行注释。

这目前仅适用于 python3,我还没有将它移植到库的 python2 版本,但可以根据要求轻松移植。此外,这也应该很容易移植到 C libyaml,因为 python 代码无论如何都是一个简单的端口。

如果您不受文件模式的约束,您可以选择一个特定的键模式来表示“忽略的条目”。例如 - 您的 yaml 数据摄取逻辑可以过滤掉任何具有以“~”开头的键的条目:

company: ~name: Must be the legal name name: Curious Adventures ~address: the official correspondence address address: 1234, New York, PO 1234

0
投票
我对 JSON 文件使用了这种方法,因为我们在评论方面遇到了同样的问题


© www.soinside.com 2019 - 2024. All rights reserved.