gpt4 book ai didi

python - YAML 加载 5e-6 作为字符串而不是数字

转载 作者:太空狗 更新时间:2023-10-29 17:04:57 24 4
gpt4 key购买 nike

当我使用 YAML 从 JSON 转储中使用 e 加载一个数字时,该数字被加载为一个字符串而不是一个 float 。

我认为这个简单的例子可以解释我的问题。

import json
import yaml

In [1]: import json

In [2]: import yaml

In [3]: All = {'one':1,'low':0.000001}

In [4]: jAll = json.dumps(All)

In [5]: yAll = yaml.safe_load(jAll)

In [6]: yAll
Out[6]: {'low': '1e-06', 'one': 1}

YAML 将 1e-06 加载为字符串而不是数字?我该如何解决?

最佳答案

问题在于 YAML 解析器设置为匹配 float ,如下所示:

Resolver.add_implicit_resolver(
u'tag:yaml.org,2002:float',
re.compile(u'''^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?
|\\.[0-9_]+(?:[eE][-+][0-9]+)?
|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*
|[-+]?\\.(?:inf|Inf|INF)
|\\.(?:nan|NaN|NAN))$''', re.X),
list(u'-+0123456789.'))

YAML spec 将科学记数法的正则表达式指定为:

-? [1-9] ( \. [0-9]* [1-9] )? ( e [-+] [1-9] [0-9]* )?

后者使点成为可选的,它不在隐式解析器的上述 re.compile() 模式中。

float 的匹配是固定的,因此它将接受带有 e/E 但没有小数点且指数没有符号的浮点值(即 + 隐含):

import yaml
import json
import re

All = {'one':1,'low':0.000001}

jAll = json.dumps(All)

loader = yaml.SafeLoader
loader.add_implicit_resolver(
u'tag:yaml.org,2002:float',
re.compile(u'''^(?:
[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?
|[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
|\\.[0-9_]+(?:[eE][-+][0-9]+)?
|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*
|[-+]?\\.(?:inf|Inf|INF)
|\\.(?:nan|NaN|NAN))$''', re.X),
list(u'-+0123456789.'))

data = yaml.load(jAll, Loader=loader)
print 'data', data

结果:

data {'low': 1e-06, 'one': 1}

JSON 允许的数字与 YAML 1.2 规范中的正则表达式之间存在差异(关于数字中所需的点和小写的 e)。JSON specification 是 IMO 非常清楚的,因为它不需要在 'e/E' 之前的点,也不需要在 'e/E' 之后的符号:

enter image description here

PyYAML 实现部分根据 JSON 规范匹配 float ,部分匹配正则表达式,但在应该有效的数字上失败。

ruamel.yaml(这是我的 PyYAML 的增强版),具有这些更新的模式并且可以正常工作:

import ruamel.yaml
import json

All = {'one':1,'low':0.000001}

jAll = json.dumps(All)

data = ruamel.yaml.load(jAll)
print 'data', data

输出:

data {'low': 1e-06, 'one': 1}

ruamel.yaml 还接受数字“1.0e6”,PyYAML 也将其视为字符串。

关于python - YAML 加载 5e-6 作为字符串而不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30458977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com