2015-02-06 73 views
3

我想与pyyaml一起使用yaml.dump将字符串转换为yaml安全的东西(即所有需要转义的东西都已正确转义)。然后我会将这些字符串插入一个大的yaml文档中。序列化与pyyaml没有省略号的字符串

的问题是,yaml.dump希望把字符串作为整个文件,并添加...(文件结尾),像

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

我如何得到它不添加\n...\n,短的只手动删除它?或者有没有更好的方法来使用pyyaml引用yaml消费的字符串?

+0

为什么首先创建python数据并最终转储到yaml的任何原因都不适合你? – Aprillion 2015-02-06 23:41:58

+1

我正在构建一个带有注释的人类可读的yaml文档。 – asmeurer 2015-02-07 03:06:22

回答

3

提供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' 
2

如果您想向包含注释的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" 

and unicode.yml

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

请注意,评论被保留,例如, PyYAML不这样做。 也可以在注释中添加注释。

+0

我的天啊!有人最终为Python编写了一个循环的yaml解析器吗?我一定要检查一下。 – asmeurer 2015-04-13 14:34:38

+0

@asmeurer有人终于做到了;-)。实际上几个月前,我现在只是想了解[so]上的pyyaml标签,看看是否可以添加一些答案,或者现有的答案可以从中受益。如果有什么不起作用,请在[bitbucket](https://bitbucket.org/ruamel/yaml)上报告一个错误(举例) – Anthon 2015-04-13 14:39:47