【问题标题】:How to print a value with double quotes and spaces in YAML?如何在 YAML 中打印带有双引号和空格的值?
【发布时间】:2018-05-12 13:05:57
【问题描述】:

我正在尝试将 Python 字典转储到 YAML,其中包含一些字符串作为值字段。

import yaml
str1 = "hello"
str2 = "world"
mystr = "\"" + str1 + str(" ") + str2 + "\""
mydict = {"a" : mystr}
f = open("temp.yaml", "w")
yaml.dump(mydict, f, default_flow_style = False, \
                    explicit_start = "---", explicit_end = "...", encoding = 'UTF-8')
f.close()

我得到的 YAML 是:

a: '"hello
 world"'

注意,值“hello world”正在溢出到下一行。 我使用的是 python 3.5,YAML 模块版本是 3.11

谁能告诉我如何让 YAML 看起来像下面这样?

a: "hello world"

【问题讨论】:

  • 1.您可能想要转储 mydict 而不是 mystr。 2. 我用 python 3.5.3 和 pyyaml 3.12 得到{a: '"hello world"'}。你确定你展示的是你使用的真实代码吗?
  • 3.如果你想用双引号输出值,你必须告诉 PyYAML(对不起,目前不知道是否有这个选项)。从我的输出{a: '"hello world"'} 中可以看出,在转储之前向字符串添加双引号不会产生预期的效果
  • @tinita : 是的,我正在倾销 'mydict' 而不是 'mystr' ...在上面编辑过...我也可以看到双引号前面的单引号...跨度>

标签: yaml python-3.5 pyyaml


【解决方案1】:

代码有点草率,但它会给出你想要的结果。

global dict_keys

def mk_double_quote(dumper, data):
    if data in dict_keys:
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='')
    else:
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')

yaml.add_representer(str, mk_double_quote)

d = {'a': 'Hello World'}
dict_keys = set(d.keys())

f = open('temp.yaml', 'w')
yaml.dump(d, f, default_flow_style=False, encoding='utf-8')
f.close()

结果将如下所示:a: "Hello World"

【讨论】:

    【解决方案2】:

    如果你想精细控制哪个字符串得到双(或单)引号,你应该使用ruamel.yaml(免责声明:我是那个包的作者)。它是 PyYAML 的改进版本,修复了 PyYAML 中的许多长期存在的问题。

    有了它,你可以做到:

    import sys
    import ruamel.yaml
    
    mystr = ruamel.yaml.scalarstring.DoubleQuotedScalarString('hello world')
    mydict = dict(a=mystr)
    
    yaml = ruamel.yaml.YAML()
    yaml.dump(mydict, sys.stdout)
    

    得到:

    a: "hello world"
    

    如果您从 YAML 文档开始,事情会更简单,您只需表明您想要保留这些多余的引号:

    yaml_str = """\
    a: "hello world"
    """
    
    yaml = ruamel.yaml.YAML()
    yaml.preserve_quotes = True
    data = yaml.load(yaml_str)
    yaml.dump(data, sys.stdout)
    

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2022-01-13
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2013-02-01
      相关资源
      最近更新 更多