使用pyyaml序列化字符串而不使用省略号

时间:2015-02-06 23:22:10

标签: python yaml pyyaml

我正在尝试使用yaml.dump和pyyaml将字符串转换为yaml安全的东西(即,所有需要转义的东西都被正确转义)。然后我将这些字符串插入到一个大的yaml文档中。

问题是yaml.dump希望将字符串视为整个文档,并添加...(文档末尾),例如

In [4]: yaml.dump("a string")
Out[4]: 'a string\n...\n'

除了手动删除之外,如何才能添加\n...\n?或者是否有更好的方法来引用使用pyyaml消耗yaml的字符串?

2 个答案:

答案 0 :(得分:4)

提供default_style参数似乎在某种程度上有所帮助:

>>> yaml.dump("a string", default_style='"')
'"a string"\n'

还有一个line_break参数,但它适用于更改终止换行符:

>>> yaml.dump("a string", default_style='"', line_break="\r")
'"a string"\r'

...它似乎无法删除

>>> yaml.dump("a string", default_style='"', line_break="")
'"a string"\n'
>>> yaml.dump("a string", default_style='"', line_break=None)
'"a string"\n'
>>> yaml.dump("a string", default_style='"', line_break=False)
'"a string"\n'

答案 1 :(得分:3)

如果你想在包含评论的yaml文档中添加内容,你应该看ruamel.yaml(我是作者)。它是PyYAML的增强,它保留了YAML文件中的注释。

这样,如果你想在这个input.yml文件中添加一些内容:

- alpha   # first one
- beta    # another one

你可以这样做:

# coding: utf-8

import ruamel.yaml

file_name = 'input.yml'

config = ruamel.yaml.load(open(file_name), ruamel.yaml.RoundTripLoader)
config.append('ω')

ruamel.yaml.dump(config, open('output.yml', 'w'),
                 Dumper=ruamel.yaml.RoundTripDumper)
ruamel.yaml.dump(config, open('unicode.yml', 'w'), allow_unicode=True,
                 Dumper=ruamel.yaml.RoundTripDumper)

并进入output.yml(我认为你称之为正确的逃避):

- alpha   # first one
- beta    # another one
- "\u03C9"

unicode.yml

- alpha   # first one
- beta    # another one
- ω

请注意,评论会被保留,例如PyYAML不行。 也可以在附加元素中添加注释。