在 python 中映射一个 yaml 文件
mapping a yaml file in python
这是一个 YAML 文件。它包含从代码到功能类别的映射列表。
以下是BANKNIFTY_O_C_0_10_W的映射:
index: [ BANKNIFTY_O_C_0_09_W: books,BANKNIFTY_O_C_0_09_W: trends,BANKNIFTY_O_C_0_09_W: trades,BANKNIFTY_O_C_0_09_W: relations,BANKNIFTY_O_P_0_09_W: books,BANKNIFTY_O_P_0_09_W: trends,BANKNIFTY_O_P_0_09_W: trades,BANKNIFTY_O_P_0_09_W: negrelations,BANKNIFTY_O_C_0_10_W: books,BANKNIFTY_O_C_0_10_W: trends,BANKNIFTY_O_C_0_10_W: trades,BANKNIFTY_O_C_0_10_W: relations,BANKNIFTY_O_C_0_10_W: options_banknifty_weekly,BANKNIFTY_O_P_0_10_W: books,BANKNIFTY_O_P_0_10_W: trends,BANKNIFTY_O_P_0_10_W: trades,BANKNIFTY_O_P_0_10_W: negrelations,BANKNIFTY_F_0: books,BANKNIFTY_F_0: trends,BANKNIFTY_F_0: trades,BANKNIFTY_F_0: relations,NIFTY_F_0: books,NIFTY_F_0: trends,NIFTY_F_0: trades,NIFTY_F_0: relations ]
我需要以下输出:
index:
- BANKNIFTY_O_C_0_09_W: [books, trends, trades, relations]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_O_C_0_10_W: [books, trends, trades, relations, options_banknifty_weekly]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]
您输入的是单项映射,其值是单项映射列表。
您的输出是一个单项映射列表。该列表是
以与原始映射的键出现相同的方式排序。这表明应该使用列表或 OrderedDict
收集该信息
这些映射的对应值是这些映射的键的原始值列表,也是按它们出现的顺序排列的,但至少部分在原始中重复,而不是在目标中重复。由于订单需要保留,因此无法使用 set
(会自动过滤双打)。相反,可以使用列表,这需要检查列表中已经存在的项目。但是在下文中,我使用另一个 OrderedDict
,因为不查看值而被滥用为“OrderedSet
”。
假定输入在文件中 input.yaml
:
import sys
import pathlib
from collections import OrderedDict
import ruamel.yaml
yaml_file = pathlib.Path('input.yaml')
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = None
data = yaml.load(yaml_file)
indexed = OrderedDict()
for elem in data['index']:
for k in elem: # just one each
single_item_map = indexed.setdefault(k, OrderedDict())
single_item_map[elem[k]] = None # arbitrary value, unused
l = []
for elem in indexed:
l.append({elem: [k for k in indexed[elem]]})
data['index'] = l
yaml.dump(data, sys.stdout)
给出:
index:
- BANKNIFTY_O_C_0_09_W: [books, trends, trades, relations]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_O_C_0_10_W: [books, trends, trades, relations, options_banknifty_weekly]
- BANKNIFTY_O_P_0_10_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]
yaml.default_flow_style=None
是必需的,因为默认情况下实例 YAML()
将使用块样式,而您的输出在叶节点上具有流样式。在 ruamel.yaml
中,通过不制作 "normal" 指令和列表,而是对内部用于保存往返信息的对象进行子类化,可以实现更精细的控制。在您的情况下,这不是必需的,因为您想要由 .default_flow_style
控制的三种模式之一(False
:全块式,True
:全流式,None
:块样式与叶流式)
这是一个 YAML 文件。它包含从代码到功能类别的映射列表。
以下是BANKNIFTY_O_C_0_10_W的映射:
index: [ BANKNIFTY_O_C_0_09_W: books,BANKNIFTY_O_C_0_09_W: trends,BANKNIFTY_O_C_0_09_W: trades,BANKNIFTY_O_C_0_09_W: relations,BANKNIFTY_O_P_0_09_W: books,BANKNIFTY_O_P_0_09_W: trends,BANKNIFTY_O_P_0_09_W: trades,BANKNIFTY_O_P_0_09_W: negrelations,BANKNIFTY_O_C_0_10_W: books,BANKNIFTY_O_C_0_10_W: trends,BANKNIFTY_O_C_0_10_W: trades,BANKNIFTY_O_C_0_10_W: relations,BANKNIFTY_O_C_0_10_W: options_banknifty_weekly,BANKNIFTY_O_P_0_10_W: books,BANKNIFTY_O_P_0_10_W: trends,BANKNIFTY_O_P_0_10_W: trades,BANKNIFTY_O_P_0_10_W: negrelations,BANKNIFTY_F_0: books,BANKNIFTY_F_0: trends,BANKNIFTY_F_0: trades,BANKNIFTY_F_0: relations,NIFTY_F_0: books,NIFTY_F_0: trends,NIFTY_F_0: trades,NIFTY_F_0: relations ]
我需要以下输出:
index:
- BANKNIFTY_O_C_0_09_W: [books, trends, trades, relations]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_O_C_0_10_W: [books, trends, trades, relations, options_banknifty_weekly]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]
您输入的是单项映射,其值是单项映射列表。
您的输出是一个单项映射列表。该列表是
以与原始映射的键出现相同的方式排序。这表明应该使用列表或 OrderedDict
这些映射的对应值是这些映射的键的原始值列表,也是按它们出现的顺序排列的,但至少部分在原始中重复,而不是在目标中重复。由于订单需要保留,因此无法使用 set
(会自动过滤双打)。相反,可以使用列表,这需要检查列表中已经存在的项目。但是在下文中,我使用另一个 OrderedDict
,因为不查看值而被滥用为“OrderedSet
”。
假定输入在文件中 input.yaml
:
import sys
import pathlib
from collections import OrderedDict
import ruamel.yaml
yaml_file = pathlib.Path('input.yaml')
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = None
data = yaml.load(yaml_file)
indexed = OrderedDict()
for elem in data['index']:
for k in elem: # just one each
single_item_map = indexed.setdefault(k, OrderedDict())
single_item_map[elem[k]] = None # arbitrary value, unused
l = []
for elem in indexed:
l.append({elem: [k for k in indexed[elem]]})
data['index'] = l
yaml.dump(data, sys.stdout)
给出:
index:
- BANKNIFTY_O_C_0_09_W: [books, trends, trades, relations]
- BANKNIFTY_O_P_0_09_W: [books, trends, trades, negrelations]
- BANKNIFTY_O_C_0_10_W: [books, trends, trades, relations, options_banknifty_weekly]
- BANKNIFTY_O_P_0_10_W: [books, trends, trades, negrelations]
- BANKNIFTY_F_0: [books, trends, trades, relations]
- NIFTY_F_0: [books, trends, trades, relations]
yaml.default_flow_style=None
是必需的,因为默认情况下实例 YAML()
将使用块样式,而您的输出在叶节点上具有流样式。在 ruamel.yaml
中,通过不制作 "normal" 指令和列表,而是对内部用于保存往返信息的对象进行子类化,可以实现更精细的控制。在您的情况下,这不是必需的,因为您想要由 .default_flow_style
控制的三种模式之一(False
:全块式,True
:全流式,None
:块样式与叶流式)