流的ruamel.round_trip_dump将新行添加到文件

时间:2017-08-29 18:03:35

标签: python yaml

所以我不确定这是一个流在转储过程中的行为,但是我使用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的流包含一个额外的换行符。虽然我可以编写一个后来截断最后一行的处理程序,但我觉得这很笨重,要么我倾向于错误,要么用这种方式写入流不是我想要的方式。

1 个答案:

答案 0 :(得分:2)

您没有提供完整的工作计划,因此无法看到您做错了什么。从您提供的代码中,我不确定您为什么尝试从单个文档流中读取多个文档。

我假设你文件中的0之后有一个换行符,你在version: 1.0之后谈论一个额外的换行符(即空行),但是我无法重现它。 / p>

如果您的三行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'))

当然会有额外的换行符。如果不需要,则应将end=''添加到print功能。