YAML:转储不带引号的Python列表
我有一个Python列表,YAML:转储不带引号的Python列表,python,yaml,Python,Yaml,我有一个Python列表,my_list,看起来像这样的[“test1”、“test2”、“test3”]。我只是想把它转储到一个没有引号的YAML文件中。因此,期望的输出是: test_1 test_2 test_3 我试过: import yaml with open("my_yaml.yaml", "w") as f: yaml.safe_dump(my_list, f) 不幸的是,这包括一行中的所有3个元素,它们被引用: “测试1”、“测试2”、“测试3” 如何修改以获得所需
my_list
,看起来像这样的[“test1”、“test2”、“test3”]
。我只是想把它转储到一个没有引号的YAML文件中。因此,期望的输出是:
test_1
test_2
test_3
我试过:
import yaml
with open("my_yaml.yaml", "w") as f:
yaml.safe_dump(my_list, f)
不幸的是,这包括一行中的所有3个元素,它们被引用:
“测试1”、“测试2”、“测试3”
如何修改以获得所需的输出?尝试使用
default\u style=None
避免使用引号,以及default\u flow\u style=False
在单独的行上输出项目:
yaml.safe_dump(my_list, f, default_style=None, default_flow_style=False)
您希望将Python列表输出为多行纯标量,并且 这将很难。通常一个列表输出一个YAML序列,该序列 具有短划线(
-
,块样式,多行)或使用
一行或多行上的方括号([]
),采用流式
带破折号的块样式:
import sys
from ruamel.yaml import YAML
data = ["test1", "test2", "test3"]
yaml = YAML()
yaml.dump(data, sys.stdout)
给出:
- test1
- test2
- test3
窄线上的流动样式:
yaml = YAML()
yaml.default_flow_style = True
yaml.dump(data, sys.stdout)
输出:
流动式,变窄:
[test1, test2, test3]
yaml = YAML()
yaml.default_flow_style = True
yaml.width = 5
yaml.dump(data, sys.stdout)
让你:
[test1,
test2,
test3]
这不太可能是您想要的,因为它会影响整个YAML文档,
还有方括号
另一种方法是将字符串转换为纯标量
实际上,您所期望的输出将被加载为什么
yaml_str = """\
test_1
test_2
test_3
"""
yaml = YAML()
x = yaml.load(yaml_str)
assert type(x) == str
assert x == 'test_1 test_2 test_3'
加载您的预期输出通常是一个很好的测试,以了解您需要什么
需要提供
因此,您必须将列表转换为多个单词
再一次的问题是,你只能强制这条线
通过设置
文档,并且大多数文档的最小宽度大于4
(虽然可以修补,但这并不能解决问题
这适用于整个文件)
结果:
test1 test2
test3
...
如果您真的不想要破折号,那么剩下什么是IMO的最佳解决方案:to
使用(字符串):
在这种情况下,将保留标量样式的换行符:
|
test1
test2
test3
谢谢。现在是每行一个,但每行开头都有一个破折号,并且仍然被引用:(您的实际数据必须包含特殊字符,在这种情况下,它无论如何都会被引用。对于示例数据
test\u 1
,等等,它不会被引用。而每行开头前的破折号正是YAML格式列出数据的方式。
from ruamel.yaml.scalarstring import PreservedScalarString
yaml = YAML()
s = PreservedScalarString('\n'.join(data) + '\n')
yaml.dump(s, sys.stdout)
|
test1
test2
test3