首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >YAML以字符串形式加载5e-6,而不是一个数字。

YAML以字符串形式加载5e-6,而不是一个数字。
EN

Stack Overflow用户
提问于 2015-05-26 12:45:06
回答 3查看 19.9K关注 0票数 45

当我用YAML从JSON转储加载一个带有e的数字时,这个数字是以字符串的形式加载的,而不是浮点。

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

代码语言:javascript
运行
复制
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作为字符串加载,而不是作为数字加载?我怎么才能修好它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-26 14:52:13

问题在于YAML解析器是为匹配浮点数而设置的,如下所示:

代码语言:javascript
运行
复制
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规范将科学表示法的正则表达式指定为:

代码语言:javascript
运行
复制
-? [1-9] ( \. [0-9]* [1-9] )? ( e [-+] [1-9] [0-9]* )?

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

浮点数的匹配可以固定,因此它将接受浮点值与e/E,但不带小数点和指数无符号(即+隐含):

代码语言:javascript
运行
复制
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

在以下方面的成果:

代码语言:javascript
运行
复制
data {'low': 1e-06, 'one': 1}

JSON所允许的数字和YAML 1.2规范中的正则表达式(关于数字中所需的点和e是小写的)之间存在差异。JSON规范非常清楚,它不需要在“e/E”之前使用点,也不需要在“e/E”之后加上一个符号:

PyYAML实现确实部分根据JSON规范浮动,部分针对正则表达式,并且在应该有效的数字上失败。

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

代码语言:javascript
运行
复制
import ruamel.yaml
import json

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

jAll = json.dumps(All)

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

产出:

代码语言:javascript
运行
复制
data {'low': 1e-06, 'one': 1}

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

票数 44
EN

Stack Overflow用户

发布于 2021-06-24 04:02:02

我认为

代码语言:javascript
运行
复制
1.0e-1

代码语言:javascript
运行
复制
1.0E-1

解决了我的问题。我读取yaml文件的代码是这样的

代码语言:javascript
运行
复制
import yaml


def read_config(path: str):
    """read yaml file"""
    with open(path, 'r') as f:
        data = yaml.safe_load(f)
    return data
票数 19
EN

Stack Overflow用户

发布于 2021-06-06 18:45:37

我刚开始使用YAML,所以不知道什么是最好的,但也不知道写什么。

代码语言:javascript
运行
复制
1.0e-1

代码语言:javascript
运行
复制
1.0E-1

在我的YAML文件中,已经开箱即用了。也就是说,有一个带系数的小数点(没有小数点,我也有字符串)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30458977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档