Python加载YAML文件时含单冒号短后缀数值异常转换问题咨询
Python加载YAML时带单冒号的特殊格式解析问题
在Python中加载YAML文件时,发现带单个冒号且冒号后数字不超过2位的内容会被自动转换为其他数值,而冒号后数字≥3位的内容则能正常保留格式。以下是具体测试过程:
示例YAML文件(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
使用PyYAML测试
代码及默认加载结果
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
可以看到,StartTime(645:0)、MidTimes(645:02)被转换为数值,而EndTimes(645:023)等冒号后数字≥3位的内容正常保留。
尝试指定Loader为CLoader、CSafeLoader、CFullLoader、CUnsafeLoader,结果与上述一致。
使用CBaseLoader的结果
改用CBaseLoader时,这类内容会被转为带单引号的字符串,但需要额外步骤去除引号:
Base: EndTimes: 645:023 MidTimes: '645:02' MissionEndTimestamp: -2037:14522 MissionStartTimestamp: -2037:14522 StartTime: '645:0' mac: 99:19:b9:fa:37:99
使用ruamel.yaml测试
先安装ruamel.yaml:
conda install -c conda-forge ruamel.yaml # 或 pip install ruamel.yaml
使用typ="rt"的测试代码及结果
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
使用typ="safe"的结果
若将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'}
问题
有没有方法可以避免上述问题,让这类带单冒号的内容像其他值一样正常加载——既不被转换为数值,也不会自动添加引号,同时保留原始格式?
内容的提问来源于stack exchange,提问作者Biaspoint
相关产品推荐
相关产品推荐

