使用PyYaml
import yaml
yaml.full_load(StringIO('a: 16:00:00'))
# {'a': 57600}
yaml.full_load(StringIO('a: 09:31:00'))
# {'a': '09:31:00'}
为什么这些行为会有差异?
旧版本的YAML支持六进制(60进制)数字,用于表示时间之类的东西。而不是添加额外的数字(如十六进制使用0-9和A-F),它只是使用由:
s分隔的十进制数字0-59。因此,16:00:00
等价于
16*(60**2) + 0*60 + 0 == 57600.
PyYAML显然仍然使用这个旧的YAML规范。
09:30:00
不以有效的十进制开头:前导零表示八进制数,但09
不是有效的八进制数。由于无法将其解析为任何类型的已知数字(八进制、十进制或十六进制),PyYAML将其还原为字符串。
YAML可以表示时间戳,但前提是它们由日期和可选的时间戳组成。PyYAML将这样的时间戳解析为datetime.datetime
对象,这似乎是合理的。
>>> yaml.full_load(StringIO('a: 2022-12-21T09:31:00'))
{a: datetime.datetime(2022, 12, 21, 9, 31)}
我在评论中引用了一个答案,https://stackoverflow.com/a/45165433/1126841,由另一个遵循YAML 1.2规范的包的作者提供,它将把值解析为字符串,而不是十六进制整数。
>>> from ruamel import yaml
>>> yaml.safe_load('a: 16:00:00')
{'a': '16:00:00'}
这取决于09:31:00
的标题0
:删除它,你会得到你的int值