0

我正在使用https://github.com/wwkimball/yamlpath和优秀的ruamel YAML 解析器来加载和使用 YAML 文件。我需要从 YAML 文件中删除一个条目,但看不到如何明显地做到这一点。这是一个例子:

源 YAML 片段:

sports:
  football:
    - Dallas Cowboys
    - Miami Dolphins
    - San Francisco 49ers

我可以获得指向这些的 YAML 路径,但我怎样才能删除(比如)迈阿密条目?使用 ruamel.yaml 给了我这样的数据结构:

ordereddict([('sports', ordereddict([('football', ['Dallas Cowboys', 'Miami Dolphins', 'San Francisco 49ers'])]))])

我可以通过说访问条目,data['sports']['football'][0]但是如何从 YAML 文件中删除该元素?我看到有一个“pop”选项,但是在这个例子中需要为嵌套键提供什么?

我查看了 yamlpath CLI 工具,似乎没有删除选项。

4

1 回答 1

1

你的'Dallas Cowboys', 显示为列表的第一个元素,但它实际上是一个CommentedSeq,它是可以保存评论和其他信息的列表的子类。

但是,您可以从中删除一个元素,就像从任何列表中一样,使用del::

import sys
import ruamel.yaml

yaml_str = """\
sports:
  football:
    - Dallas Cowboys
    - Miami Dolphins
    - San Francisco 49ers
"""

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
data = yaml.load(yaml_str)
print('debug:', type(data['sports']['football']), 
                     isinstance(data['sports']['football'], list), '\n')


del data['sports']['football'][0]
yaml.dump(data, sys.stdout)

这使:

debug: <class 'ruamel.yaml.comments.CommentedSeq'> True 

sports:
  football:
    - Miami Dolphins
    - San Francisco 49ers

如果您只有 pop 选项,则需要 pop element 0,因此del将上面的行替换为:

 data['sports']['football'].pop(0)

给出相同的结果。

我希望其中任何一个都可以用 yamlpath 完成

于 2020-04-15T16:31:07.183 回答