我正在将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'''
如何获得所需的格式?
答案 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()
?)将上班。 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