如何从 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 完成
我正在使用 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 完成