【问题标题】:YAML appending DATA within a fileYAML 在文件中附加 DATA
【发布时间】:2016-12-25 00:04:52
【问题描述】:

我有一个这样的 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 文件。

【问题讨论】:

  • A_part1 的值是一个映射,而Main_part1 的值是一个(字符串)标量(除了A_part1 之外,顶层映射的所有其他键值也是如此)。将映射附加到标量对您意味着什么(或在 Python 中将 dict 附加到 str),您是否希望将映射的字符串表示形式添加到标量?您希望结果与标量“合并”(Main_Part2 的值)这意味着什么?
  • 都是字符串。我相信冒号后应该有一个间隙。另外,不要专注于里面的东西(标签部分)。当点击 div A 时,我需要一种方法将 A(两个部分)里面的东西附加到 Main(两个部分)。
  • 如果标量中冒号后有空格,则需要将标量括在引号中(单引号或双引号)。你能举一个你期望的输出 YAML 的例子吗?
  • @Anthon 我已经编辑了这个问题。请立即查看。

标签: yaml pyyaml


【解决方案1】:

你所拥有的键对于这个操作并不能很好地工作,所以最好的办法是将顶级键的键解析为备用字典,键指向与原始映射/字典相同的(字典)值:

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,尽管并非所有解析器都接受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2021-12-23
    • 2018-07-16
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多