Python YAML:用引号将每个条目括起来

Python YAML:用引号将每个条目括起来,python,yaml,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 但是我希望a、b和c中的每一个都显示为字符串。所以我想: --- -

我正在将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
但是我希望
a
b
c
中的每一个都显示为字符串。所以我想:

---
- "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'''

如何获得所需的格式?

标量开头的引号在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\u dump()
    (除非您不能),这样您就可以预先知道使用
    safe\u load()
    (您不是在使用不安全的
    load()
    加载())加载是可行的
  • PyYAML有一个流接口:dump通常接受第二个参数,如果未指定该参数,则将其流到内存缓冲区中,并返回该缓冲区的内容,然后将其流到文件中。不要这样做,这是内存效率低下和缓慢
default\u style='“
将任何标量转换为字符串。任何标量?是的,any标量,包括映射键(实际上可能是您想要的)和整数以及YAML支持的所有其他特殊类型:

将我的列表更改为:

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

第二个答案实际上回答了这个问题。请注意,前两个YAML文件在语义上是相同的:它们都用三个字符串“a”、“b”和“c”表示列表。