PyYAML使用前导问号转储dict,并在lin下打印值

2024-10-03 06:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

当用很长的键转储dict时,我得到如下结果:

? 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

相反,我想:

  • 没有领导?对于每个dict元素
  • 没有在下一行打印钥匙

像这样:

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

Tags: fordatadatetimeapplicationvarpicontentraspberry
1条回答
网友
1楼 · 发布于 2024-10-03 06:25:56

首先,输出是非常好的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是潜在的不安全。你知道吗


如果你想和我一样鲁阿迈尔.亚马尔(免责声明:我是 例如,如果您需要与yaml1.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)

同样的结果。你知道吗

相关问题 更多 >