【问题标题】:How can I add a blank line before some data using Ruamel.yaml如何使用 Ruamel.yaml 在某些数据之前添加一个空行
【发布时间】:2017-02-13 07:08:00
【问题描述】:

我似乎无法弄清楚如何使用 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]})

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

【问题讨论】:

    标签: ruamel.yaml


    【解决方案1】:

    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]})
    

    比较上面的 cmets 应该会让您知道要尝试什么:

    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
    

    CommentToken ct 也可以从头开始构建:

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

    按原样,例如在ruamel.yaml.comments.CommentedBase.yaml_set_start_comment() 完成。

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

    【讨论】:

    • 非常感谢@Anthon 的帮助。此时我无法尝试,因为看起来我需要更高版本的 Ruamel,当我尝试在我的 Mac 上安装最新版本的 Ruamel 时,安装失败。我可能会单独提出一个错误。
    • 在安装 ruamel.yaml 之前,请确保您的 virtualenv 中有最新版本的 pip/setuptools 等。安装在哪个版本之后停止工作?
    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多