python - lib - yaml editor online
pyyaml: dumping sin etiquetas (5)
yo tengo
>>> import yaml
>>> yaml.dump(u''abc'')
"!!python/unicode ''abc''/n"
Pero yo quiero
>>> import yaml
>>> yaml.dump(u''abc'', magic=''something'')
''abc/n''
¿Qué param mágico no obliga a etiquetar?
Acabo de comenzar con Python y YAML, pero probablemente esto también ayude. Simplemente compare los resultados:
def test_dump(self):
print yaml.dump([{''name'': ''value''}, {''name2'': 1}], explicit_start=True)
print yaml.dump_all([{''name'': ''value''}, {''name2'': 1}])
Necesita una nueva clase de volcado que haga todo lo que hace la clase Dumper estándar, pero anula los representaters para str y unicode.
from yaml.dumper import Dumper
from yaml.representer import SafeRepresenter
class KludgeDumper(Dumper):
pass
KludgeDumper.add_representer(str,
SafeRepresenter.represent_str)
KludgeDumper.add_representer(unicode,
SafeRepresenter.represent_unicode)
Lo que lleva a
>>> print yaml.dump([u''abc'',u''abc/xe7''],Dumper=KludgeDumper)
[abc, "abc/xE7"]
>>> print yaml.dump([u''abc'',u''abc/xe7''],Dumper=KludgeDumper,encoding=None)
[abc, "abc/xE7"]
De acuerdo, todavía estoy perplejo sobre cómo mantener esto lindo.
>>> print u''abc/xe7''
abcç
Y rompe un yaml.load () posterior
>>> yy=yaml.load(yaml.dump([''abc'',''abc/xe7''],Dumper=KludgeDumper,encoding=None))
>>> yy
[''abc'', ''abc/xe7'']
>>> print yy[1]
abc�
>>> print u''abc/xe7''
abcç
Poco adicional a la excelente respuesta de Interjay, puede mantener su Unicode en una recarga si se ocupa de las codificaciones de sus archivos.
# -*- coding: utf-8 -*-
import yaml
import codecs
data = dict(key = u"abcç/U0001F511")
fn = "test2.yaml"
with codecs.open(fn, "w", encoding="utf-8") as fo:
yaml.safe_dump(data, fo)
with codecs.open(fn, encoding="utf-8") as fi:
data2 = yaml.safe_load(fi)
print ("data2:", data2, "type(data.key):", type(data2.get("key")) )
print data2.get("key")
Los contenidos de test2.yaml en mi editor:
{key: "abc/xE7/uD83D/uDD11"}
imprimir resultados:
(''data2:'', {''key'': u''abc/xe7/U0001f511''}, ''type(data.key):'', <type ''unicode''>) abcç🔑
Además, después de leer http://nedbatchelder.com/blog/201302/war_is_peace.html Estoy bastante seguro de que safe_load / safe_dump es donde quiero estar de todos modos.
Puede usar safe_dump
lugar de dump
. Solo tenga en cuenta que no podrá representar objetos arbitrarios de Python en ese momento. Además, cuando load
el YAML, obtendrá un objeto str
lugar de unicode
.
Qué tal esto:
def unicode_representer(dumper, uni):
node = yaml.ScalarNode(tag=u''tag:yaml.org,2002:str'', value=uni)
return node
yaml.add_representer(unicode, unicode_representer)
Esto parece hacer que el dumping de objetos Unicode funcione de la misma manera que el dumping de objetos str para mí (Python 2.6).
In [72]: yaml.dump(u''abc'')
Out[72]: ''abc/n.../n''
In [73]: yaml.dump(''abc'')
Out[73]: ''abc/n.../n''
In [75]: yaml.dump([''abc''])
Out[75]: ''[abc]/n''
In [76]: yaml.dump([u''abc''])
Out[76]: ''[abc]/n''