Как удалить вложенную запись из Python OrderedDict (ruamel)? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую https://github.com/wwkimball/yamlpath и превосходный YAML-парсер ruamel для загрузки и работы с 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», но что нужно предоставить в этом примере для вложенных ключей?

Я посмотрел на инструменты CLI yamlpath, и, похоже, нет опции удаления.

1 Ответ

0 голосов
/ 15 апреля 2020

Ваш '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, вам нужно добавить элемент 0, поэтому замена строки del в приведенном выше тексте на:

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

даст тот же результат.

Я надеюсь, что любой из них можно сделать с помощью yamlpath

...