Python 转储 YAML 在字符串周围使用双引号

wol*_*stc 3 python quotes yaml double-quotes python-3.5

在 Python 3.5 中,我将以下字典转储到 .yaml 文件中。

D={'name': 'mydata', value: {'x': 1, 'y': 2, 'z':3}}

当我运行以下代码时:

import ruamel
import ruamel.yaml as yaml
D={'name': 'mydata', 'value': {'x': 1, 'y': 2, 'z':3}}
yaml.round_trip_dump(D, open('my_yaml.yaml', 'w'),
                     default_flow_style=False, indent=4)
Run Code Online (Sandbox Code Playgroud)

结果my_yaml.yaml如下所示:

name: mydata                                                                    
value:                                                                     
    z: 3                                                                     
    x: 1                                                                   
    y: 2
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有一种方便的方法可以在 周围写上双引号mydata,即,而不是name: mydata,它写成name: "mydata"

Ant*_*hon 5

有一个相对简单的方法可以做到这一点:

import sys
import ruamel.yaml

S = ruamel.yaml.scalarstring.DoubleQuotedScalarString
D = {'name': S('mydata'), 'value': {'x': 1, 'y': 2, 'z':3}}

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4)
yaml.dump(D, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

最后三行使用 YAML 实例,是较新的做法:

ruamel.yaml.round_trip_dump(D, sys.stdout, indent=4)
Run Code Online (Sandbox Code Playgroud)

使用新的 API,您可以为序列指定不同的缩进值。

不管怎样,上面的内容给了你:

name: "mydata"
value:
    x: 1
    y: 2
    z: 3
Run Code Online (Sandbox Code Playgroud)

default_flow_style=False使用ruamel.yaml往返模式时无需显式执行。


DoubleQuotedScalarString的子类,如果您加载首选输出,则str用于存储内容,同时保留引号:"mydata"

yaml.preserve_quotes = True
data = yaml.load("""\
name: "mydata"
value:
    x: 1
    y: 2
    z: 3
""")
print(type(data['name']))
Run Code Online (Sandbox Code Playgroud)

给出:

<class 'ruamel.yaml.scalarstring.DoubleQuotedScalarString'>
Run Code Online (Sandbox Code Playgroud)

如果输出往返正确,那么检查数据结构ruamel.yaml加载总是一个好主意,无论是双引号、块样式文字标量、十六进制整数还是注释保留。
该库在幕后做了很多没有文档的事情,并且该库的作者可能懒得提供更多内容。