【问题标题】:How to remove a nested entry from Python OrderedDict (ruamel)?如何从 Python OrderedDict (ruamel) 中删除嵌套条目?
【发布时间】:2020-07-28 16:54:33
【问题描述】:

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

来源 YAML sn-p:

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 工具,似乎没有删除选项。

【问题讨论】:

    标签: yaml python-3.6 ruamel.yaml ordereddict


    【解决方案1】:

    您的'Dallas Cowboys' 显示为列表的第一个元素,但它 其实是一个CommentedSeq,是一个list的子类,可以保存cmets等信息。

    但是,您可以从中删除一个元素,就像从任何列表中一样,使用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 完成

    【讨论】:

    • 谢谢 - 我确实使用了您引用的 del 选项并且效果很好,但是有没有办法以编程方式使用变量来做到这一点?类似于:a = "'sports'" b = "'football'" c = 0 del data[a][b][c] 尝试使用 eval 不起作用...
    • 当然,如果你已经分配了他们,你可以做del data[a][b][c]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2022-12-12
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多