YAML中映射映射中的文字

时间:2017-05-02 14:10:17

标签: python mapping yaml literals pyyaml

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

我试图使用PyYAML将文字放在YAML中的映射映射中。基于YAML specs,映射映射通过以下方式实现:

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中将映射放在映射映射中的问题?

1 个答案:

答案 0 :(得分:1)

你的“文字”更正式地称为literal block style scalar。除了block style之外,还有flow style。您正在将流样式用于与键Sammy Sosa关联的值。

flow style you are not allowed to have block style

  

YAML允许将流节点嵌入到块集合中(但反之亦然)。

,但这是您尝试使用键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年开始) )。