YAML 在文件中附加数据

YAML appending DATA within a file

我有一个这样的 YAML 文件:

Main_part1:
   label1: Main PArt1


Main_part2:
   label2: Main Part2


A_part1:
  label3: part1 of A

A_part2:
   label4: part 2 of A

B_part1:
    label5: this is part 1 of B

B_part2:
  label6: this is part 2 of B

我有一个 html 文件,其中包含 A 和 B 的 2 个 <div> 标记。每当单击 A 时,A_part1 的内容应附加到 Main_part1A_part2 应该附加到 Main_part2 的内容。对于 B 也是如此。并将响应发送回添加了 A/B 内容的网页。

最后,我想创建一个合并 Main_Part1Main_Part2 的最终 YAML 文件。

可以使用任何类型的解决方案(Java/Python 等)。

我创建了不同的标签来显示所有块中的内部信息是不同的。例如:

假设您单击 A,YAML 文件将如下所示:

Main_part1:
   label1: Main PArt1
   label3: part1 of A
Main_part2:
   label2: Main Part2
   label4: part 2 of A

A_part1:
   label3: part1 of A

A_part2:
   label4: part 2 of A

B_part1:
   label5: this is part 1 of B

B_part2:
   label6: this is part 2 of B

然后是合并 Main_part1Main_part2 的最终 YAML 文件。

你拥有的键对于这个操作来说并不是很好,所以最好的办法是将顶层键的键解析为备用字典,键 指向 与原始值相同的(字典)值 mapping/dict:

import sys
import ruamel.yaml

yaml_str = """\
Main_part1:
   label1: Main PArt1
Main_part2:
   label2: Main Part2
A_part1:
  label3: part1 of A
A_part2:
   label4: part 2 of A
B_part1:
    label5: this is part 1 of B
B_part2:
  label6: this is part 2 of B
"""

data = ruamel.yaml.round_trip_load(yaml_str)
alt = {}
for key in data:
    section, part = key.split('_')
    alt[(section, part)] = data[key]
alt[('Main', 'part1')].update(alt[('Main', 'part2')])

之后你需要一个小帮手,调用它并转储原来的:

def collapse(collapse_key):
    for key in alt:
        if key[0] == collapse_key:
            alt[('Main', key[1])].update(alt[key])

collapse('A')  # <- this should be a parameter to your script based on the click.

ruamel.yaml.round_trip_dump(data, sys.stdout)

给出:

Main_part1:
  label1: Main PArt1
  label3: part1 of A
  label2: Main Part2
  label4: part 2 of A
Main_part2:
  label2: Main Part2
  label4: part 2 of A
A_part1:
  label3: part1 of A
A_part2:
  label4: part 2 of A
B_part1:
  label5: this is part 1 of B
B_part2:
  label6: this is part 2 of B

如果您以这样的方式创建密钥,那当然会更容易一些 您将要使用它们(即使用两个元素):

(Main, part1):
   label1: Main PArt1
(Main, part2):
   label2: Main Part2
(A, part1):
  label3: part1 of A
(A, part2):
   label4: part 2 of A
(B, part1):
    label5: this is part 1 of B
(B, part2):
  label6: this is part 2 of B

以上是非常好的 YAML,尽管并非所有解析器都接受。