PyYAML 使用键的前导问号转储字典并在下一行打印值
PyYAML dumps dict using leading question marks for keys and prints values next line
当使用很长的键转储 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
相反,我想:
- 没有前导?对于每个字典元素
- 下一行没有打印密钥
像这样:
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 不会警告您
关于那个。您应该只使用适当大的 integer 值
相反,如以下代码所示(假设数据在文件中
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)
同样的结果。
当使用很长的键转储 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
相反,我想:
- 没有前导?对于每个字典元素
- 下一行没有打印密钥
像这样:
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 不会警告您
关于那个。您应该只使用适当大的 integer 值
相反,如以下代码所示(假设数据在文件中
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)
同样的结果。