我正在尝试使用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)
这有什么问题吗?
答案 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()
中。