简单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.CSafeLoader
、CFullLoader
、CUnsafeLoader
相同(
另一个加载器具有不同的结果,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.yaml
或pip 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为基数的整数,这对于时间和角度值来说很方便