PyYAML使用领先的问号为键转储字典并在下一行打印值

时间:2018-10-11 23:07:19

标签: python yaml pyyaml

当用很长的键转储字典时,我得到这样的东西:

? ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.NewDateTime
: 2018-10-11 17:59
? ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.SetNewDateTime
: 2018-10-11 17:59
? ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Ascend
: 2018-10-11 17:59
? ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Descend
: 2018-10-11 17:59

相反,我想:

  • 没有领导力吗?对于每个字典元素
  • 下一行没有打印密钥

类似这样的东西:

ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.NewDateTime: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.SetNewDateTime: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Ascend: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Descend: 2018-10-11 17:59

我该如何完成以上工作?

我当前的转储命令如下:

yaml.dump(
    some_dict, 
    open(shades, 'w+'), 
    default_flow_style=False, 
    width=float("inf")
)

现在,我通过转储可变内容和字符串替换来修补猴子:

content = content.replace("? ","")
content = content.replace("\n:",":")

1 个答案:

答案 0 :(得分:0)

首先,该输出是非常好的YAML。我装回什么 你甩了看起来不太好,但是有必要这样做 因为键很长,并且不适合默认的行长。

您提供了width参数,但问题是 float("inf")不合适,PyYAML不会警告您 关于那个。您应该只使用适当的整数值 相反,如以下代码所示(假设数据在文件中 shades.yaml):

import sys
import yaml

ONEMILLION = 1000**2

with open('shades.yaml') as fp:
    data = yaml.safe_load(fp)
yaml.safe_dump(data, sys.stdout, default_flow_style=False, width=ONEMILLION)

输出:

ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.NewDateTime: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTime.SetNewDateTime: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Ascend: 2018-10-11 17:59
ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.FeedFlow.Auger[].Descend: 2018-10-11 17:59

不,您不能执行ONEMILLION = int(float("inf")),但会收到错误消息。

我在这里使用safe_dump,不是因为有必要,而是 足够,并且因为它减少了您使用load()的可能性 在PyYAML中可能不安全。


如果您想对ruamel.yaml做同样的事情(免责声明:我是 该软件包的作者),例如如果您需要与YAML 1.2兼容,或者需要对 缩进超出PyYAML可以提供的范围,您可以这样做:

from pathlib import Path
import ruamel.yaml

shades = Path('shades.yaml')

yaml = ruamel.yaml.YAML()
yaml.width = ONEMILLION
# next line is not necessary, style is preserved and input is block-style
yaml.default_flow_style=False  
data = yaml.load(shades)
yaml.dump(data, sys.stdout)

具有相同的结果。