Frage

Ich habe

>>> import yaml
>>> yaml.dump(u'abc')
"!!python/unicode 'abc'\n"

Aber ich will

>>> import yaml
>>> yaml.dump(u'abc', magic='something')
'abc\n'

Was Magie param Kräfte keine Tagging?

War es hilfreich?

Lösung

Sie können safe_dump anstelle von dump. Denken Sie daran, dass es nicht in der Lage sein wird, Python zu repräsentieren beliebige Objekte dann. Auch wenn Sie die YAML load, erhalten Sie ein str Objekt statt unicode.

Andere Tipps

Wie wäre es damit:

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)

Dies scheint die gleiche Arbeit Dumping Unicode-Objekte zu machen, wie str Objekte für mich (Python 2.6) Dumping.

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'

Sie müssen eine neue dumper Klasse, die alles tut, die Standard-Dumper-Klasse tut, sondern überschreibt den representers für str und 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)

Das führt zu

>>> 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"]

Zugegeben, ich bin immer noch ratlos, wie man diese recht zu halten.

>>> print u'abc\xe7'
abcç

Und es bricht eine spätere yaml.load ()

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

wenig neben interjay die ausgezeichnete Antwort, können Sie Ihre Unicode auf einem reload halten können, wenn Sie die Pflege Ihrer Dateicodierungen nehmen.

# -*- 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")

test2.yaml Inhalte in meinem Editor:

{key: "abc\xE7\uD83D\uDD11"}

Druckausgaben:

('data2:', {'key': u'abc\xe7\U0001f511'}, 'type(data.key):', <type 'unicode'>) abcç🔑

Plus, nach dem Lesen http://nedbatchelder.com/blog/201302/war_is_peace.html ich bin ziemlich sicher, dass safe_load / safe_dump ist, wo ich will sowieso sein.

Ich habe mit Python und YAML gerade erst begonnen, aber wahrscheinlich dies kann auch helfen. Man vergleiche nur Ausgänge:

def test_dump(self):
    print yaml.dump([{'name': 'value'}, {'name2': 1}], explicit_start=True)
    print yaml.dump_all([{'name': 'value'}, {'name2': 1}])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top