Python YAML保留换行符而不添加额外的换行符

时间:2015-06-24 09:19:20

标签: python yaml

我有一个与this question类似的问题,我需要在YAML映射值字符串中插入换行符,而不想自己插入\n。答案建议使用:

Data: |
      Some data, here and a special character like ':'
      Another line of data on a separate line

而不是

Data: "Some data, here and a special character like ':'\n
      Another line of data on a separate line"

还在最后添加了新行 ,这是不可接受的。

我尝试使用Data: >,但这显示出完全不同的结果。我在读完yaml文件后一直在剥离最终换行符,当然这样可行,但这并不优雅。有没有更好的方法来保留换行而不在最后添加额外的

我正在使用python 2.7 fwiw

1 个答案:

答案 0 :(得分:7)

如果您使用|这会将标量变为literal block style scalar。但是|的默认行为是剪切,并且不能获得您想要的字符串(因为它留下了最终的换行符)。

您可以通过附加block chomping indicators

来“修改”|的行为
  

     

剥离由“ - ”扼流指示器指定。在这种情况下,最终换行符和任何尾随空行都会从标量内容中排除。

     

剪辑

     

如果未指定明确的chomping指示符,则剪切是使用的默认行为。在这种情况下,最终换行符将保留在标量的内容中。但是,任何尾随空行都会从标量内容中排除。

     

     

保持由“+”咀嚼指示器指定。在这种情况下,最后的换行符和任何尾随的空行被认为是标量内容的一部分。这些额外的线条不会折叠。

通过将stripchomping运算符“-”添加到“|”,可以阻止/删除最终换行符:¹

import ruamel.yaml as yaml

yaml_str = """\
Data: |-
      Some data, here and a special character like ':'
      Another line of data on a separate line
"""

data = yaml.load(yaml_str)
print(data)

给出:

  

{'数据':“有些数据,此处和特殊字符如':'\ n另一行上的另一行数据”}

¹这是使用ruamel.yaml完成的,我是作者。你应该得到与PyYAML相同的结果(其中ruamel.yaml是一个超集,在往返时保留注释和文字标量块)。