YAML 中映射的映射中的文字

Literals in a mapping of mappings in YAML

如何使用 YAML 在映射的映射中创建文字?

我正在尝试使用 PyYAML. Based on YAML specs 将文字放入 YAML 中的映射映射中,映射映射是通过以下方式实现的:

Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }

而保留换行符的文字是通过以下方式完成的:

stats: |
  63 Home Runs
  0.288 Batting Average

现在我正尝试将文字与映射的映射结合起来,如下所示:

Sammy Sosa: {
    hr: 63,
    avg: 0.288,
    stats: |
  63 Home Runs
  0.288 Batting Average
  }

并抛出错误:

yaml.scanner.ScannerError: while scanning for the next token
found character '|' that cannot start any token
  in "test.yml", line 4, column 12

是否有其他方法或变通方法将文字放入 YAML 中映射的映射中?

你的 "literal" 更正式地称为 literal block style scalar. Apart from block style there is flow style。您正在为与键 Sammy Sosa 关联的值使用流样式。

flow style you are not allowed to have block style

之内

YAML allows flow nodes to be embedded inside block collections (but not vice-versa).

,但这就是您尝试对键 stats 的值执行的操作。除此之外,您还没有足够缩进文字标量。

通过删除匹配 {} 和尾随 ,,将流式映射更改为块式。对齐键(在块样式中需要)并适当缩进文字标量(即超过 stats 的开始列)。

这是有效的 YAML,相当于您想要实现的目标:

Sammy Sosa:
  hr: 63
  avg: 0.288
  stats: |
    63 Home Runs
    0.288 Batting Average

您的第一个块样式映射中的流样式映射示例也可以重写为块样式映射中的块样式映射,如下所示:

Mark McGwire: 
  hr: 65
  avg: 0.278
Sammy Sosa: 
  hr: 63
  avg: 0.288

对于这个目的没有区别,但你也应该知道你使用的是 YAML 1.2 规范(从 2009 年开始),但是 Python 的 PyYAML 库只支持大多数较旧的 YAML 1.1(自 2005 年起)。