ruamel.round_trip_dump将换行符添加到流中

3
我很不确定这是否代表了在转储期间流的一般行为,但我正在使用ruamel.yaml进行往返更改。
因此,拿着我的非常简单的YAML:
namespace: default
docker_registry_path: dockerhub/hello
version: 1.0

我加载了YAML:

for config in ruamel.yaml.round_trip_load_all(stream=open(config_path)):
  ....
  do some magic
  ....

ruamel.yaml.round_trip_dump(config, sys.stdout))  #prints out with no extra newlines
ruamel.yaml.round_trip_dump(config, stream=open(config_path, 'w'))

控制台看起来很好,没有额外的换行符。返回到YAML的流中有一个额外的换行符。虽然我可以写一个处理程序之后截断最后一行,但我觉得这很笨拙,要么我是在错误地转储,要么以这种方式编写流不是我想要的方式。


我不认为这很相关,但你使用的操作系统和Python版本是什么? - Anthon
@Anton,谢谢。我应该在我的示例yaml中更清楚地表达,我不想复制/粘贴真实的yaml,因为其中包含公司特定的内容。多个文档的原因是我们在ansible主机文件中有一个标题,其中包含文档分隔符上面的注释。这些注释是公司名称、作者等等。 我目前正在使用Python 2.7.12在Mac上工作。最终将在Centos 7.3上运行。 - TripodNH
@Anthon 看起来这是一个特定于操作系统的问题。当转到Centos 7.3时,流的round_trip_dump行为不会添加换行符。我认为这个问题已经解决了。 - TripodNH
1个回答

3

您没有提供一个完整的程序,所以无法看出您错在哪里。从您提供的代码中,我不确定为什么您要从单个文档流中读取多个文档。

我假设在您的文件中,在0后面有一个换行符,并且您在谈论version: 1.0之后的额外换行符(即空行),但我无法重现这种情况。

如果您的三行YAML输入文档按照所示保存在config.yaml中,并在Python2或Python3上运行以下命令:

import sys
import ruamel.yaml

config_path = "config.yaml"
for config in ruamel.yaml.round_trip_load_all(stream=open(config_path)):
    pass

ruamel.yaml.round_trip_dump(config, sys.stdout)
ruamel.yaml.round_trip_dump(config, stream=open('abc.yaml', 'w'))

print(repr(open('abc.yaml').read()))

您将获得相同的输出:

namespace: default
docker_registry_path: dockerhub/hello
version: 1.0
'namespace: default\ndocker_registry_path: dockerhub/hello\nversion: 1.0\n'

正如您所看到的,文件末尾没有空行。

我只在控制台上看到过额外的换行符那是因为人们做了类似于以下操作:

print(ruamel.yaml.round_trip_dump(config))

或者
print(ruamel.yaml.round_trip_dump(config), stream=open('klm.yaml', 'w'))

当然,额外的换行符是可以预期的。如果不想要,他们应该在print函数中添加end=''


@Anton,我的原始yaml末尾没有换行符。原始文件有32行,没有换行符。当我使用标准日志记录器打印对象时,它没有换行符。正如所述,我向sys.stdout转储看起来也很好,没有换行符。只有当我使用流的round_trip_dump时,才会多出一个换行符或总共33行文件。 抱歉没有发布整个代码,之前有个同事问了一个带有完整代码文件的问题,并因此被解雇了。所以我对将所有代码放在那里非常敏感。 - TripodNH
正如您上面所述,我已经尝试了这个方法,您是正确的,额外的换行是在打印期间完成的。如上所述,看起来我的问题是在OSX(10.12.5)上运行Python 2.7.12时出现了问题,其中流向YAML添加了一个换行符。我认为您的回复是有效的解决方案。谢谢 - TripodNH
@TripodNH 我完全理解您不能发布完整的原始代码。在这种情况下,请尝试制作一个最小化的示例,以显示问题(有时候这会非常清楚地显示问题,以至于您不再需要在 [so] 上提问 :-))。如果您需要摆脱尾随的换行符,请使用例如 open('klm.yaml', 'w').write(ruamel.yaml.round_trip_dump(config).rstrip()) - Anthon
1
非常感谢您提供的代码片段。它解决了我的OSX换行问题,并在Linux上也运行良好。使用这种方式进行写入是如此简单而有效的修复方法。 - TripodNH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接