如何从 Python OrderedDict (ruamel) 中删除嵌套条目?

How to remove a nested entry from Python OrderedDict (ruamel)?

我正在使用 https://github.com/wwkimball/yamlpath and the excellent ruamel YAML parser 加载和使用 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 工具,似乎没有删除选项。

您的 '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

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

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

给出相同的结果。

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