yaml.dump()正在打印原始字符串



如果我运行以下代码:

import yaml
d = {'data': 'an b'}
print(yaml.dump(d))

这个打印:

data: "an b"

但是我想让它打印

data: 'a
b'

为什么会发生这种情况?

没有"原始字符串"的概念。在YAML中,这是来自Python的东西它不会出现在代码或输出的任何部分中。YAML具有标量,其中一些标量通常在Python中作为字符串加载。如果YAML标量都是未加引号的,然后可以解释(如布尔值,日期时间,浮点数等)。如果它们被引用或是块样式标量,然后这样的标量的解释/转换遵循不同的规则。

如果您正在加载YAML,并且在YAML中单个引号标量中有换行符和换行符之后的行不是空的,换行符和它周围的白色空格,转换为单个空格。

因此,如果您加载预期的输出(我在这里使用ruamel.yaml,因为它支持YAML 1.2,而PyYAML只支持YAML 1.1的一个子集(自2009年以来已过时):

import sys
import ruamel.yaml
yaml_str = """
data: 'a
b'
"""

yaml = ruamel.yaml.YAML(typ='safe')
yaml.width = 6
data = yaml.load(yaml_str)
print(data)

给了:

{'data': 'a b'}

如果您在生成YAML时不知道自己在做什么,请从加载开始期望的输出。在您想要转储的数据中操作字符串几乎永远不会发生具有预期的效果,因为YAML有自己的标量表示规则,它们是与Python字符串中的转义不同。

据我所知,你不能得到你想要的输出使用ruamel.yaml没有后处理转储的输出(PyYAML也不能),因为之前没有办法插入虚假的空间字母b在任何其他方式。您可以减小行宽以强制换行(如果没有其他换行符)更长的行,即当没有使用一些更真实的数据时)。

PyYAML的dump()函数从不输出任何内容:它要么流到第二个参数,要么缓冲流并返回它是一个字符串(可以交给print)。PyYAML允许您执行print(yaml.dump(d))。这在文档中也有,但是这是糟糕的练习。使用yaml.dump(d, sys.stdout))更有效(在时间和内存使用方面),除此之外,它不会通过添加额外的换行符来改变输出。

最新更新