我正在尝试使用nose-testconfig创建一个YAML文件,其数据如下:
"Computers":
"Brand: "Dell"
"Cost": 500
"IP": "194.66.82.11"
"Brand: "HP"
"Cost": 600
"IP": "194.66.82.13"
"Brand: "Asus"
"Cost": 550
"IP": "194.66.82.15"
我遇到的问题是每个重复的项目都会被覆盖。我需要将它列为字典列表,但是我不知道如何进行这项工作。我不能只使用括号和大括号的内联格式,因为我正在使用的实际数据在每个字典中有更多的数据,因此行太长。
有没有办法以保持每个字典列表分开的方式格式化?
答案 0 :(得分:3)
我认为你想要的是:
{ Computers:
[ { Brand: "Dell",
Cost: 500,
IP: "192.66.82.11"
},
{ Brand: "HP",
Cost: 600,
IP: "192.168.82.13"
},
{ Brand: "Asus",
Cost: 550,
IP: "192.168.82.15"
}
]
}
这表示带有一个键“计算机”的映射(“词典”),其值是具有三个项目的序列(“列表”),每个项目都是具有三个键“Brand”,“Cost”的映射“,和”IP。“
例如,在JavaScript中,它会反序列化为此结构:
Log.i("title", "message")
P.S。你会注意到我删除了引号。引号是YAML中的反模式 - 在极少数情况下它们是必要的(例如,如果你想要将“500”反序列化为字符串而不是数字)并且它们会增加大量的线路噪声,从而击败了YAML的目的,便于阅读和编辑。
P.P.S。我发现非常有用的实用程序是Online YAML Parser,它会在您键入的任何YAML输入时以JSON或Python表示法显示结果。
答案 1 :(得分:1)
如果您不确定某个构造的YAML应该如何看待,那么您应该做的是用您选择的编程语言(不应该存在这种不确定性)创建构造,然后将其转储。例如。在Python中:
import sys
import ruamel.yaml
data = dict(Computers=[
dict(Brand="Dell", Cost=500, IP="194.66.82.11"),
dict(Brand="HP", Cost=600, IP="194.66.82.13"),
dict(Brand="Asus", Cost=550, IP="194.66.82.15"),
])
yaml = YAML()
yaml.dump(data, sys.stdout)
给你:
Computers:
- IP: 194.66.82.11
Brand: Dell
Cost: 500
- IP: 194.66.82.13
Brand: HP
Cost: 600
- IP: 194.66.82.15
Brand: Asus
Cost: 550
你看到的是简单标量周围的引号是不必要的(但根据规范它们是允许的,因此将它们放入其中是完全可以的)。您还看到您错过了在YAML文件中放置一个列表(在块模式下由-
虚线项表示)。
使用这种方式可以很容易地自己确定如何将数据格式化为有效的YAML。对于某些解析器,您需要尝试使用块或非流式样式来获得更好的可读结果,对于ruamel.yaml(我是作者)块样式是默认的,因为它是IMO,更具可读性。
请注意,YAML中映射的键根据定义是无序的,尽管ruamel.yaml可以在往返模式下为您保留这些键