Das Problem liegt in der Tatsache, dass die YAML Resolver eingerichtet ist Schwimmern übereinstimmen, wie folgt:
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'-.'))
während die YAML spec gibt den regulären Ausdruck für wissenschaftliche Notation als:
-? [1-9] (\. [0-9]* [1-9])? (e [-+] [1-9] [0-9]*)?
letzterem macht den Punkt optional, wobei es sich nicht um das obige re.compile()
Muster handelt.
gesuchte von Schwimmern befestigt werden kann, so wird es Gleitkommawerte mit einem e
/E
akzeptiert aber ohne Dezimalpunktes und mit Exponenten ohne Vorzeichen (dh +
impliziert):
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'-.'))
data = yaml.load(jAll, Loader=loader)
print 'data', data
ergibt:
Es gibt Diskrepanzen zwischen dem, was JSON in Zahlen zulässt, und der Regex in der Spezifikation YAML 1.2 (bezüglich des erforderlichen Punkts in der Zahl und e
in Kleinbuchstaben). Die JSON specification ist IMO sehr klar, dass sie nicht den Punkt benötigt, bevor die E/E 'noch das erfordert ist ein Zeichen nach dem ‚e/E‘:
Die PyYAML Implementierung überein schwebt teilweise gemäß der JSON-Spezifikation und teilweise gegen die Regex und scheitert an Zahlen, die gültig sein sollten.
ruamel.yaml (das ist meine erweiterte Version PyYAML), hat diese aktualisierte Muster und funktioniert einwandfrei:
import ruamel.yaml
import json
All = {'one':1,'low':0.000001}
jAll = json.dumps(All)
data = ruamel.yaml.load(jAll)
print 'data', data
mit Ausgang:
data {'low': 1e-06, 'one': 1}
ruamel.yaml nimmt auch die Zahl ‚1,0E6 ', die PyYAML auch als String sieht.
möglich Duplikat von [Disable wissenschaftliche Notation in Python json.dumps Ausgabe] (http://stackoverflow.com/questions/18936554/disable-scientific-notation-in-python-json-dumps-output) – SiHa
@SiHa That könnte ein Weg sein, das Problem zu vermeiden, aber das eigentliche Problem ist, dass YAML eine Obermenge von JSON und '1e-06' sein soll, wenn Sie aus der 'json.dumps()' ** ist ** ein Korrekt JSON-Nummer und AFAICT auch eine korrekte YAML-Nummer. PyYAML analysiert es nicht richtig. – Anthon
OK, war nur ein Gedanke ... – SiHa