如何从 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
- 如何删除第一行的
!!omap
文本?
- 如何删除
Name
和 Children
旁边的 -
(破折号)?
我知道文件中包含这些字符不会影响功能,但我很好奇如何删除输入文件中不存在的那些字符。
我正在使用 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 的派生物。
因此,请考虑更新您的扩展程序和代码。
我正在尝试从 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
- 如何删除第一行的
!!omap
文本? - 如何删除
Name
和Children
旁边的-
(破折号)?
我知道文件中包含这些字符不会影响功能,但我很好奇如何删除输入文件中不存在的那些字符。
我正在使用 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 的派生物。
因此,请考虑更新您的扩展程序和代码。