3

我似乎无法弄清楚如何使用 Ruamel.yaml 在数据之间添加一个空行。

假设我有数据:

---
a: 1

b: 2

我需要添加到这一点,以便我将拥有:

---
a: 1

b: 2

c: 3

我了解空行是作为 CommentToken 实现的:

Comment(comment=None,
  items={'data': [None, None, CommentToken(value=u'\n\n'), None], 'b': [None, None, CommentToken(value=u'\n\n'), None]})

我不知道如何操作该结构。

4

1 回答 1

4

Comment对象不是来自您提供的输入,因为data它不是映射中的键,应该是a

import ruamel.yaml

yaml_strs = [
"""\
---
a: 1

b: 2
""",
"""\
---
a: 1

b: 2

c: 3
"""]

for yaml_str in yaml_strs:
    data = ruamel.yaml.round_trip_load(yaml_str)
    print(data.ca)

给出:

Comment(comment=None,
  items={'a': [None, None, CommentToken(), None]})
Comment(comment=None,
  items={'a': [None, None, CommentToken(), None], 'b': [None, None, CommentToken(), None]})

比较上述评论应该让您了解要尝试的内容:

import sys
import ruamel.yaml

yaml_str = """\
---
a: 1

b: 2
"""

data = ruamel.yaml.round_trip_load(yaml_str)
data['c'] = 3
ct = data.ca.items['a'][2]
data.ca.items['b'] = [None, None, ct, None]
ruamel.yaml.round_trip_dump(data, sys.stdout)

这使:

a: 1

b: 2

c: 3

CommentTokenct也可以从头开始构建:

ct = ruamel.yaml.tokens.CommentToken('\n\n', ruamel.yaml.error.CommentMark(0), None)

照原样,例如在ruamel.yaml.comments.CommentedBase.yaml_set_start_comment().

0参数 to是注释缩进的CommentMark()程度,在空行的情况下并不重要,但仍然需要提供。

于 2017-02-13T07:51:11.907 回答