如何从 yaml 文件中删除文本“!!omap”?

How to remove text "!!omap" from yaml file?

我正在尝试从 YAML 文件中删除一些属性,我成功地这样做了,但它在输出文件中有一些额外的字符,我不确定如何删除它们。

这是输入的 YAML 文件:

Person:
  Name: John
  Children:
    - Stacy
    - Rick
    - Josh
  Wife:
   Name: Mary 
  Id: 123

我希望 YAML 文件在删除一些属性后如下所示:

Person: 
  Name: John
  Children:
    - Rick
    - Stacy

这是我正在使用的脚本:

import re
import time
from collections import OrderedDict

from ruamel.yaml import ruamel

file_path = '/path/to/yml/file'
# Read yaml file
config, ind, bsi = ruamel.yaml.util.load_yaml_guess_indent(open(file_path))

allowed_attributes = ['Name', 'Children']
allowed_children = ['Rick', 'Stacy']

root_node_name = 'Person'

config[root_node_name] =  OrderedDict((attribute_name, config[root_node_name][attribute_name]) for attribute_name in allowed_attributes)
config[root_node_name]['Children'] = [child_name for child_name in allowed_children]


new_file_path = f"{re.sub('.yml','',file_path)}_{time.strftime('%Y%m%d-%H%M%S')}.yml"

with open(new_file_path, "w") as fp:
    ruamel.yaml.YAML().dump(config, fp)

这是它生成的文件:

Person: !!omap
- Name: John
- Children:
  - Rick
  - Stacy
  1. 如何删除第一行的 !!omap 文本?
  2. 如何删除 NameChildren 旁边的 -(破折号)?

我知道文件中包含这些字符不会影响功能,但我很好奇如何删除输入文件中不存在的那些字符。

我正在使用 Python3 并且 ruamel.yaml 版本是 0.17.4

在 YAML 中,映射被定义为无序,尽管键在 YAML 文档中当然有明确的顺序。 因此,如果您转储显式排序的映射,例如 Python 的 OrderedDict,保证的排序是通过转储 单个映射的序列(总是有序的),用 !!omap 标记。如果你读回那个输出,你会再次 使用 ruamel.yaml 时得到一个 OrderedDict,所以正如您已经注意到的那样,没有任何问题(但是一些处理链中输出的工具可能无法正确处理)。

较新的字典 Python 3 个实现已排序,将在没有此类标签和所需序列的情况下被转储 以保证订单。 Python 2.7+ 可以通过使用 CommentedMap 实现相同的效果,它充当 OrderedDict(不转储标签):

import sys

import ruamel.yaml 
from ruamel.yaml.comments import CommentedMap as OrderedDict

file_path = 'input.yaml'
config, ind, bsi = ruamel.yaml.util.load_yaml_guess_indent(open(file_path))
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=ind, offset=bsi)  # set the original sequence indent and offset of the dash

allowed_attributes = ['Name', 'Children']
allowed_children = ['Rick', 'Stacy']

root_node_name = 'Person'

config[root_node_name] =  OrderedDict((attribute_name, config[root_node_name][attribute_name]) for attribute_name in allowed_attributes)
config[root_node_name]['Children'] = [child_name for child_name in allowed_children]


yaml.dump(config, sys.stdout)

给出:

Person:
  Name: John
  Children:
    - Rick
    - Stacy

请注意,自 2007 年以来,官方推荐的包含 YAML 文档的文件的扩展名是 .yaml。 更令人困惑的是,还有一种更古老但不常遇到的 YML 格式,它是 XML 的派生物。 因此,请考虑更新您的扩展程序和代码。