YAML:将每个条目括在引号中

时间:2018-07-18 23:03:15

标签: python yaml

我正在将Python列表写入YAML文件。我的列表如下:

my_list = ["a", "b", "c"]

如果我这样做:

with open("my_yaml.yaml", "w") as f:
    f.write(yaml.dump(my_list, explicit_start=True, default_flow_style=False))

然后我的YAML文件如下所示:

---
- a
- b
- c

但是我希望abc中的每一个都显示为字符串。所以我想:

---
- "a"
- "b"
- "c"

如果我这样做:

new_list = ['\'' + entry + '\'' for entry in my_list]
with open("my_yaml.yaml", "w") as f:
        f.write(yaml.dump(new_list, explicit_start=True, default_flow_style=False))

然后它显示为:

---
- '''a'''
- '''b'''
- '''c'''

如何获得所需的格式?

1 个答案:

答案 0 :(得分:1)

标量开头的行情在YAML中具有特殊含义,它们使带有resp的普通标量与众不同。双引号和单引号标量。 为了转储带有“自然”引号的字符串,YAML必须经过额外的限制:双引号时插入反斜杠(\),双引号时插入额外的单引号'单引号字符串。后者是导致您输出的原因。

如果您不需要更多的细粒度控制,则可以执行以下操作:

import yaml

my_list = ["a", "b", "c"]
with open("my_yaml.yaml", "w") as f:
    yaml.safe_dump(my_list, f, default_style='"', enable_unicode=True,
                   explicit_start=True, default_flow_style=False)

给出:

---
- "a"
- "b"
- "c"

请注意:

  • 您应该始终使用safe_dump()(除非不能使用),这样您就可以预先知道使用safe_load()进行加载(您正在使用的是不安全的load() ?)将上班。
  • PyYAML具有流接口:dump通常带有第二个参数,如果未指定,则将其流式传输到内存中的缓冲区中并返回该缓冲区的内容,然后将其流式传输到文件中。不要这样做,这会导致内存效率低下且速度慢。

default_style='"'将标量转换为字符串。有标量吗?是的,任何标量,包括映射键(实际上可能是您想要的),整数和YAML支持的所有其他特殊类型:

my_list更改为:

my_list = ["a", "b", "c", dict(d=42), 3.14, True]

会给您:

---
- "a"
- "b"
- "c"
- "d": !!int "42"
- !!float "3.14"
- !!bool "true"

如果您不希望这样做,而只希望引用(特定的)序列元素,则可以使用ruamel.yaml(免责声明:我是该程序包的作者),并执行类似的操作:

import ruamel.yaml 
from ruamel.yaml.scalarstring import (DoubleQuotedScalarString as dq, 
                                      SingleQuotedScalarString as sq)

yaml = ruamel.yaml.YAML()
my_list = [dq("a"), sq("b"), dq("c"), dict(d=42), 3.14, True]

with open("my_yaml.yaml", "w") as f:
    yaml.dump(my_list, f)

获得:

- "a"
- 'b'
- "c"
- d: 42
- 3.14
- true