YAML:转储不带引号的Python列表

时间:2018-08-09 00:55:22

标签: 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个元素,并用引号将它们引用:

'test_1', 'test_2', 'test_3'

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

2 个答案:

答案 0 :(得分:0)

尝试使用default_style=None避免引用,并使用default_flow_style=False在单独的行上输出项目:

yaml.safe_dump(my_list, f, default_style=None, default_flow_style=False)

答案 1 :(得分:0)

您想将Python列表输出为多行普通标量,并且 会很难。通常,列表会输出YAML序列,其中 带有破折号( "features": { "sentiment": {}, "relations":{ "model":"XXXXXXXXXXXXXXXXX" }, "entities":{ "model":"XXXXXXXXXXXXXXXXX", "sentiment":"1" ----I've tried with "true" too--- } } ,以块样式显示,多行)或使用 方括号(-,以流样式显示在一行或多行上。

带虚线的块样式:

[]

给予:

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)

这不太可能实现,因为它会影响整个YAML文档, 而且仍然有方括号。

一种选择是将字符串转换为纯标量。这是 实际上,您想要的输出将被加载为什么。

[test1,
test2,
test3]

加载期望的输出通常是一个很好的测试,以了解您的目标 需要提供。

因此,您必须将列表转换为多字 串。再一次的问题是你只能强行 通过设置宽度来中断我所知道的任何YAML库 文档,并且大多数文档的最小宽度大于4 (尽管可以修补无法解决该问题 这适用于整个文档。

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'

结果:

yaml = YAML()
yaml.width = 5
s = ' '.join(data)
yaml.dump(s, sys.stdout)

如果您真的不想破折号,那么这将是IMO最佳解决方案: 使用literal block style scalar(字符串):

test1 test2
test3
...

在这种标量样式中,换行符得以保留:

from ruamel.yaml.scalarstring import PreservedScalarString

yaml = YAML()
s = PreservedScalarString('\n'.join(data) + '\n')
yaml.dump(s, sys.stdout)