YAML:转储不带引号的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” 如何修改以获得所需

我有一个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”


如何修改以获得所需的输出?

尝试使用
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