Python ruamel.round\u trip\u流的转储将换行添加到文件中

Python ruamel.round\u trip\u流的转储将换行添加到文件中,python,yaml,Python,Yaml,因此,我不确定流在转储期间通常是如何工作的,但我正在使用ruamel.yaml进行往返更改 以我非常简单的YAML为例: namespace: default docker_registry_path: dockerhub/hello version: 1.0 我加载YAML: 对于ruamel.yaml.round\u trip\u load\u all(stream=open(config\u path))中的配置: .... 施点魔法 .... ruamel.yaml.round_tri

因此,我不确定流在转储期间通常是如何工作的,但我正在使用ruamel.yaml进行往返更改

以我非常简单的YAML为例:

namespace: default
docker_registry_path: dockerhub/hello
version: 1.0
我加载YAML:

对于ruamel.yaml.round\u trip\u load\u all(stream=open(config\u path))中的配置:
....
施点魔法
....
ruamel.yaml.round_trip_dump(config,sys.stdout))#打印出来时没有额外的换行符
ruamel.yaml.round\u trip\u dump(配置,stream=open(配置路径,'w'))

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

您没有提供完整的工作程序,因此不可能看出您做错了什么。根据您提供的代码,我不确定您为什么尝试从单个文档流中读取多个文档

我假设您的文件中
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))


当然,额外的换行是可以预料的。如果不需要,他们应该将
end=''
添加到
print
函数中。

我认为这与此无关,但您使用的是什么操作系统和Python版本?@Anton,谢谢。我应该更清楚我正在阅读的yaml示例,我不想复制/粘贴真正的yaml,因为它包含特定于公司的内容。之所以有多个文档,是因为我们的ansible hosts文件中的头包含文档分隔符上方的注释。这些评论包括公司名称、作者等。我目前正在使用Python2.7.12开发Mac。这最终将在Centos 7上运行。3@Anthon看起来这是操作系统特有的问题。转到Centos 7.3时,流的往返转储行为不会添加换行符。我认为这个问题已经解决了。“Anton,所以我原来的YAML在结尾没有新行。原始版本有32行,没有换行符。当我只使用标准记录器打印对象时,它没有换行符,如上所述,我对sys.stdout的转储看起来也很好,没有换行符。只有在使用流的往返转储时,文件中才会有额外的换行或总共33行。很抱歉没有发布完整的代码,有一位同事问了一个问题,并且有完整的代码文件,因此被解雇了。所以我对把我所有的代码都放在那里很敏感。正如你上面所说的,我试过这个,你是对的,额外的换行是在打印过程中完成的。如上所述,我的问题似乎是在OSX(10.12.5)上运行Python2.7.12的问题,其中stream向yaml添加了一个换行符。我认为你的回答是有效的解决办法。感谢you@TripodNH我完全理解您不能发布完整的原始代码。在这种情况下,试着用一个最小的例子来说明问题(它经常(有时会清楚地说明问题,你不再需要问:-))。如果您需要删除尾随的换行符,请使用例如
open('klm.yaml','w').write(ruamel.yaml.round\u trip\u dump(config.rstrip())
。非常感谢您的最后一段代码。这解决了我的OSX换行问题,在Linux上也很有效。这么简单的解决办法就是这样写。
print(ruamel.yaml.round_trip_dump(config), stream=open('klm.yaml', 'w'))