首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python在引号中生成的值很少

Python在引号中生成的值很少
EN

Stack Overflow用户
提问于 2018-09-20 11:20:54
回答 2查看 4.2K关注 0票数 5

我正在使用我的Python中的yaml模块生成一个YAML文件。以下是一个例子:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
hello: world
hostname: '"testhost"'
instance_type: test
my_list:
  - bar: test2
    foo: test
  - bar: test4
    foo: test3
name: foo

在上面的输出主机名值有单引号和双引号,我只想要双引号。

预期产出:

代码语言:javascript
复制
hello: world
hostname: "testhost"
instance_type: test
my_list:
  - bar: test2
    foo: test
  - bar: test4
    foo: test3
name: foo
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-20 11:50:38

不能像引用部分数据那样在YAML中强制引用引号。由于引号迫使提交者将引号应用于标量(即不能再像yaml文件中的其他字符串值那样使用普通标量)。

您需要创建一个带有引号的类型。最简单的方法是使用ruamel.yaml (免责声明:我是PyYAML的增强版本的作者,支持YAML 1.2,支持注释和引号的双向保存等)。

代码语言:javascript
复制
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)

这意味着:

代码语言:javascript
复制
instance_type: test
hostname: "testhost"
name: foo
my_list:
  - foo: test
    bar: test2
  - foo: test3
    bar: test4
hello: world

您还可以轻松地加载并转储输出,生成完全相同的输出:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2018-09-20 11:43:32

你会得到双倍的引号,因为这就是你输入的数据。这一行:

代码语言:javascript
复制
'hostname': "\"testhost\"",

表示您希望hosthame有一个以"开头和结尾的10字符字符串的值,这就是您在yaml中所看到的。带有转义双引号的字符串"\"testhost\""和yaml版本的'"testhost"'是相同数据的两种不同的源代码表示形式。如果要在yaml中嵌入特殊字符(如换行符的\n ),则只需要在yaml中使用双引号。但是yaml.dump()会帮你处理的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52423986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档