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_part1
和 A_part2
应该附加到 Main_part2
的内容。对于 B 也是如此。并将响应发送回添加了 A/B 内容的网页。
最后,我想创建一个合并 Main_Part1
和 Main_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_part1
和 Main_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,尽管并非所有解析器都接受。
我有一个这样的 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_part1
和 A_part2
应该附加到 Main_part2
的内容。对于 B 也是如此。并将响应发送回添加了 A/B 内容的网页。
最后,我想创建一个合并 Main_Part1
和 Main_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_part1
和 Main_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,尽管并非所有解析器都接受。