我正在使用我的Python中的yaml模块生成一个YAML文件。以下是一个例子:
import yaml
class MyDumper(yaml.Dumper):
def increase_indent(self, flow=False, indentless=False):
return super(MyDumper, self).increase_indent(flow, False)
foo = {
'instance_type': 'test',
'hostname': "\"testhost\"",
'name': 'foo',
'my_list': [
{'foo': 'test', 'bar': 'test2'},
{'foo': 'test3', 'bar': 'test4'}],
'hello': 'world',
}
print yaml.dump(foo, Dumper=MyDumper, default_flow_style=False)输出:
hello: world
hostname: '"testhost"'
instance_type: test
my_list:
- bar: test2
foo: test
- bar: test4
foo: test3
name: foo在上面的输出主机名值有单引号和双引号,我只想要双引号。
预期产出:
hello: world
hostname: "testhost"
instance_type: test
my_list:
- bar: test2
foo: test
- bar: test4
foo: test3
name: foo发布于 2018-09-20 11:50:38
不能像引用部分数据那样在YAML中强制引用引号。由于引号迫使提交者将引号应用于标量(即不能再像yaml文件中的其他字符串值那样使用普通标量)。
您需要创建一个带有引号的类型。最简单的方法是使用ruamel.yaml (免责声明:我是PyYAML的增强版本的作者,支持YAML 1.2,支持注释和引号的双向保存等)。
import sys
import ruamel.yaml
from ruamel.yaml.scalarstring import DoubleQuotedScalarString as dq
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
foo = {
'instance_type': 'test',
'hostname': dq("testhost"),
'name': 'foo',
'my_list': [
{'foo': 'test', 'bar': 'test2'},
{'foo': 'test3', 'bar': 'test4'}],
'hello': 'world',
}
yaml.dump(foo, sys.stdout)这意味着:
instance_type: test
hostname: "testhost"
name: foo
my_list:
- foo: test
bar: test2
- foo: test3
bar: test4
hello: world您还可以轻松地加载并转储输出,生成完全相同的输出:
from ruamel.yaml.compat import StringIO
buf = StringIO()
yaml.dump(foo, buf)
yaml.preserve_quotes = True
data = yaml.load(buf.getvalue())
yaml.dump(data, sys.stdout)发布于 2018-09-20 11:43:32
你会得到双倍的引号,因为这就是你输入的数据。这一行:
'hostname': "\"testhost\"",表示您希望hosthame有一个以"开头和结尾的10字符字符串的值,这就是您在yaml中所看到的。带有转义双引号的字符串"\"testhost\""和yaml版本的'"testhost"'是相同数据的两种不同的源代码表示形式。如果要在yaml中嵌入特殊字符(如换行符的\n ),则只需要在yaml中使用双引号。但是yaml.dump()会帮你处理的。
https://stackoverflow.com/questions/52423986
复制相似问题