首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用前导问号对下一行的键和打印值进行PyYAML转储

使用前导问号对下一行的键和打印值进行PyYAML转储
EN

Stack Overflow用户
提问于 2018-10-11 23:07:18
回答 1查看 752关注 0票数 2

当我用很长的键倾倒垃圾时,我会得到这样的信息:

代码语言:javascript
复制
? 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元素
  • 下一行中没有打印密钥

就像这样:

代码语言:javascript
复制
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

我如何才能完成上述工作?

我当前的转储命令如下:

代码语言:javascript
复制
yaml.dump(
    some_dict, 
    open(shades, 'w+'), 
    default_flow_style=False, 
    width=float("inf")
)

现在,我通过将变量内容和字符串替换为下面的内容来进行修补:

代码语言:javascript
复制
content = content.replace("? ","")
content = content.replace("\n:",":")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 06:01:02

首先,这个输出是非常好的YAML。我把你扔的东西放回去了。它看起来不太好,但有必要这样做,因为键很长,并且不适合默认的行长。

您提供了width参数,但问题是float("inf")不是一个适当的值,PyYAML没有对此发出警告。您应该使用一个适当大的整数值,如下代码所示(假设数据在shades.yaml文件中):

代码语言:javascript
复制
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)

产出:

代码语言:javascript
复制
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,不是因为它是必要的,而是因为它足够了,还因为它减少了您使用在PyYAML中可能不安全的load()的可能性。

如果您想对ruamel.yaml (免责声明:我是该包的作者)做同样的操作,例如,如果您需要与YAML 1.2兼容,或者需要对缩进的控制比PyYAML所能提供的更多,您可以这样做:

代码语言:javascript
复制
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)

结果是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52770050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档