当我用YAML从JSON转储加载一个带有e的数字时,这个数字是以字符串的形式加载的,而不是浮点。
我认为这个简单的例子可以解释我的问题。
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作为字符串加载,而不是作为数字加载?我怎么才能修好它?
发布于 2015-05-26 14:52:13
问题在于YAML解析器是为匹配浮点数而设置的,如下所示:
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规范将科学表示法的正则表达式指定为:
-? [1-9] ( \. [0-9]* [1-9] )? ( e [-+] [1-9] [0-9]* )?
后者使点是可选的,在隐式解析器中,它不在上述re.compile()
模式中。
浮点数的匹配可以固定,因此它将接受浮点值与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规范非常清楚,它不需要在“e/E”之前使用点,也不需要在“e/E”之后加上一个符号:
PyYAML实现确实部分根据JSON规范浮动,部分针对正则表达式,并且在应该有效的数字上失败。
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也将其视为字符串。
发布于 2021-06-24 04:02:02
我认为
1.0e-1
或
1.0E-1
解决了我的问题。我读取yaml文件的代码是这样的
import yaml
def read_config(path: str):
"""read yaml file"""
with open(path, 'r') as f:
data = yaml.safe_load(f)
return data
发布于 2021-06-06 18:45:37
我刚开始使用YAML,所以不知道什么是最好的,但也不知道写什么。
1.0e-1
或
1.0E-1
在我的YAML文件中,已经开箱即用了。也就是说,有一个带系数的小数点(没有小数点,我也有字符串)。
https://stackoverflow.com/questions/30458977
复制相似问题