我有一个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'
如何修改以获得所需的输出?
答案 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)