Python YAML:用引号将每个条目括起来
我正在将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中的每一个都显示为字符串。所以我想: --- -
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”表示列表。