python - PyYAML 使用键的前导问号转储字典并在下一行打印值

标签 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

相反,我想:

  • 没有领先?对于每个字典元素
  • 下一行没有打印 key

类似这样的事情:

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:",":")

最佳答案

首先,该输出是完美的 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)

结果相同。

关于python - PyYAML 使用键的前导问号转储字典并在下一行打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770050/

相关文章:

python - 在 PyQt 中,如何将终端嵌入到窗口中?

python - 与 Python 3 的隐式区分?

c++ - 如何在 Sublime Text 上的 Windows/Cygwin 上构建 yaml-cpp?

python - 通过 PyYAML 创建带有别名的 yaml 文件

python-2.7 - 在 YAML 输出中抑制 !!python/unicode

python - !r 叫什么?

python - 如何替换 txt 文件中已存在的数据 --python

yaml - YAML中隐藏的可重用 block

amazon-web-services - 在 yaml 模板中未获得正确的输出

python - PyYAML : Control ordering of items called by yaml. 加载()