Yaml文件将内容保存为乱七八糟的格式,并带有额外的卷曲“ {}”

时间:2019-08-15 14:57:00

标签: python yaml pyyaml

我正在尝试使用yaml文件保存内容,但是我在本地计算机上将其保存为一种格式,而在服务器/群集中将其保存为另一种格式。聚在一起

在集群中似乎是阶段性的:

{seconds: 56.40548229217529}
{minutes: 0.940091371536255}
{hours: 0.015668189525604248}
{days: 6.528412302335103e-04}

但是在本地看起来不错:

seconds: 3.597913980484009
minutes: 0.05996523300806681
hours: 0.0009994205501344469
days: 4.164252292226862e-05

为什么要插入那些多余的括号?

我正在使用的代码:

    with open(meta_data_path, "w") as conffile:
        seconds = hours*60.0*60.0
        minutes = hours*60.0
        days = hours/24.0
        seconds = f'seconds: {seconds}'
        minutes = f'minutes: {minutes}'
        hours = f'hours: {hours}'
        days = f'days: {days}'
        yaml.dump(yaml.load(str(seconds), Loader=Loader), conffile)
        yaml.dump(yaml.load(str(minutes), Loader=Loader), conffile)
        yaml.dump(yaml.load(str(hours), Loader=Loader), conffile)
        yaml.dump(yaml.load(str(days), Loader=Loader), conffile)

这有什么问题吗?

1 个答案:

答案 0 :(得分:0)

是的,这是有问题的,因为您正在将四个YAML文档写入同一文件,而没有使用---进行分隔。

您应该将explicit_start=True参数添加到每个dump()中以获取:

---
{seconds: 56.40548229217529}
---
{minutes: 0.940091371536255}
---
{hours: 0.015668189525604248}
---
{days: 6.528412302335103e-04}

resp:

---
seconds: 3.597913980484009
---
minutes: 0.05996523300806681
---
hours: 0.0009994205501344469
---
days: 4.164252292226862e-05

外观不同但加载相同(使用load_all())。

或者,您可以更改代码以将所有字符串加载到单个数据结构中,然后一次性将其丢弃:

    data = {}
    data.update(yaml.load(str(seconds), Loader=Loader))
    data.update(yaml.load(str(minutes), Loader=Loader))
    data.update(yaml.load(str(hours), Loader=Loader))
    data.update(yaml.load(str(days), Loader=Loader))
    yaml.dump(data, conffile)

与您在本地得到的结果一样,

{seconds: 56.40548229217529, minutes: 0.940091371536255, hours: 0.015668189525604248, days: 6.528412302335103e-04}

在服务器上,又是等效的YAML。

产生差异的原因是,在较早(5.1之前)的PyYAML版本中,dump()的'default_flow_style'参数的默认值为None,从而导致叶集节点以流式转储,对于映射/字典,这会导致花括号)。对于5.1+,默认设置更改为False,这将导致所有集合均为块样式。因此,您在本地具有5.1+版本,并且群集上有旧的PyYAML。

要使它们工作相同,请在两个平台上安装相同的PyYAML版本和/或将default_flow_style=False显式添加到dump()中。