简单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无论出于什么原因,任何带有两个或更少尾随数字的冒号的“数字”值都会转换为另一个“数字”.
也曾尝试过:
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是最好的,但是添加单引号不是很好,现在必须添加另一步来去掉这些引号.有办法绕过这事吗?使其作为其他值加载。
UPDATE#1
基于@ubaumann的回答,我添加了以下内容。
安装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'}发布于 2022-10-08 09:10:51
PyYAML解析作为YAML 1.1的子集,在该规范中有六进制数,本质上用于处理分钟和秒(如时间、弧)的值。由于这让许多混乱,这被迅速从YAML 1.2规范,但PyYAML从来没有升级后,2009年,该规范推出。
您可以升级到YAML 1.2解析器,例如我的ruamel.yaml,并获得您期望的结果。
发布于 2022-10-07 14:38:33
https://stackoverflow.com/questions/73988503
复制相似问题