Python打开/加载yaml文件会更改值(数字?),如果它们包含冒号:并且冒号后面的数字小于3



简单example.yml文件

Base:
StartTime: 645:0
EndTimes: 645:023
MidTimes: 645:02
mac: 99:19:b9:fa:37:99
MissionStartTimestamp: -2037:14522
MissionEndTimestamp: -2037:14522

当它被加载到python 中时

import yaml
with open("example.yml", 'r') as file:
example_ = yaml.safe_load(file)
print(yaml.dump(example_, default_flow_style=False))

结果:

Base:
EndTimes: 645:023
MidTimes: 38702
MissionEndTimestamp: -2037:14522
MissionStartTimestamp: -2037:14522
StartTime: 38700
mac: 99:19:b9:fa:37:99

无论出于何种原因;数字";具有2个或更少尾随数字的单个冒号的值被转换为另一个"冒号";数字";。。。

也尝试过:

import yaml
with open("example.yml", 'r') as file:
example_ = yaml.load(file, Loader=yaml.CLoader)
print(yaml.dump(example_, default_flow_style=False))

相同的结果(与Loader=yaml.CSafeLoaderCFullLoaderCUnsafeLoader相同(

另一个加载器具有不同的结果,CBaseLoader将其转换为单引号字符串:

Base:
EndTimes: 645:023
MidTimes: '645:02'
MissionEndTimestamp: -2037:14522
MissionStartTimestamp: -2037:14522
StartTime: '645:0'
mac: 99:19:b9:fa:37:99

看起来CBaseLoader是最好的,但添加单引号并不好,现在必须添加另一个步骤来去掉这些引号。。。有办法绕过这个吗?以使其在其他值加载时加载。

更新#1

根据@ubamann的回答,我添加了以下内容。

安装ruamel.yaml-conda install -c conda-forge ruamel.yamlpip install ruamel.yaml

更改文件头信息

import sys
from ruamel.yaml import YAML
yaml=YAML(typ="rt")

打开/转储调用

with open("example.yml", 'r') as file:
example_ = yaml.load(file)
yaml.dump(example_, sys.stdout)

结果


Base:
StartTime: 645:0000
EndTimes: 645:023
MidTimes: 645:02
mac: 99:19:b9:fa:37:99
MissionStartTimestamp: -2037:14522
MissionEndTimestamp: -2037:14522

如果您将行yaml=YAML(typ="rt")修改为yaml=YAML(typ="safe"),您将获得字符串中的所有内容:


Base: {EndTimes: '645:023', MidTimes: '645:02', MissionEndTimestamp: '-2037:14522',
MissionStartTimestamp: '-2037:14522', StartTime: '645:0000', mac: '99:19:b9:fa:37:99'}

PyYAML解析为YAML 1.1的子集,在该规范中有六进制数,主要用于处理分秒值(如时间、弧(。由于这让很多人感到困惑,这很快就从YAML 1.2规范中删除了,但自2009年该规范发布以来,PyYAML从未升级过。

您可以升级到YAML1.2解析器,例如myruamel.YAML,并获得您期望的结果。

YAML整数可以用不同的方式格式化,使用:将其解释为sexagesimal(基数60(

https://yaml.org/type/int.html

使用":"可以表示以60为基数的整数,这对于时间和角度值来说很方便

最新更新