online lib python yaml pyyaml

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''