read create python parsing yaml

read - python create yaml file



AnĂ¡lisis YAML y Python? (3)

¿Cuál es la mejor manera de analizar un archivo YAML en un objeto de Python?

Por ejemplo, este YAML:

Person: name: XYZ

Para esta clase de Python:

class Person(yaml.YAMLObject): yaml_tag = ''Person'' def __init__(self, name): self.name = name

Estoy usando PyYAML por cierto.


Aquí hay una manera de probar qué implementación de YAML el usuario ha seleccionado en el virtualenv (o el sistema) y luego definir load_yaml_file apropiadamente:

load_yaml_file = None if not load_yaml_file: try: import yaml load_yaml_file = lambda fn: yaml.load(open(fn)) except: pass if not load_yaml_file: import commands, json if commands.getstatusoutput(''ruby --version'')[0] == 0: def load_yaml_file(fn): ruby = "puts YAML.load_file(''%s'').to_json" % fn j = commands.getstatusoutput(''ruby -ryaml -rjson -e "%s"'' % ruby) return json.loads(j[1]) if not load_yaml_file: import os, sys print """ ERROR: %s requires ruby or python-yaml to be installed. apt-get install ruby OR apt-get install python-yaml OR Demonstrate your mastery of Python by using pip. Please research the latest pip-based install steps for python-yaml. Usually something like this works: apt-get install epel-release apt-get install python-pip apt-get install libyaml-cpp-dev python2.7 /usr/bin/pip install pyyaml Notes: Non-base library (yaml) should never be installed outside a virtualenv. "pip install" is permanent: https://.com/questions/1550226/python-setup-py-uninstall Beware when using pip within an aptitude or RPM script. Pip might not play by all the rules. Your installation may be permanent. Ruby is 7X faster at loading large YAML files. pip could ruin your life. https://.com/questions/46326059/ https://.com/questions/36410756/ https://.com/questions/8022240/ Never use PyYaml in numerical applications. https://.com/questions/30458977/ If you are working for a Fortune 500 company, your choices are 1. Ask for either the "ruby" package or the "python-yaml" package. Asking for Ruby is more likely to get a fast answer. 2. Work in a VM. I highly recommend Vagrant for setting it up. """ % sys.argv[0] os._exit(4) # test import sys print load_yaml_file(sys.argv[1])


Desde http://pyyaml.org/wiki/PyYAMLDocumentation :

add_path_resolver(tag, path, kind) agrega una resolución de etiquetas implícita basada en rutas. Una ruta es una lista de claves que forman una ruta a un nodo en el gráfico de representación. Los elementos de rutas pueden ser valores de cadena, enteros o Ninguno. El tipo de nodo puede ser str, list, dict o None.

#!/usr/bin/env python import yaml class Person(yaml.YAMLObject): yaml_tag = ''!person'' def __init__(self, name): self.name = name yaml.add_path_resolver(''!person'', [''Person''], dict) data = yaml.load(""" Person: name: XYZ """) print data # {''Person'': <__main__.Person object at 0x7f2b251ceb10>} print data[''Person''].name # XYZ


Si su archivo YAML se ve así:

# tree format treeroot: branch1: name: Node 1 branch1-1: name: Node 1-1 branch2: name: Node 2 branch2-1: name: Node 2-1

Y has instalado PyYAML así:

pip install PyYAML

Y el código de Python se ve así:

import yaml with open(''tree.yaml'') as f: # use safe_load instead load dataMap = yaml.safe_load(f)

La variable dataMap ahora contiene un diccionario con los datos del árbol. Si imprime dataMap usando PrettyPrint, obtendrá algo como:

{''treeroot'': {''branch1'': {''branch1-1'': {''name'': ''Node 1-1''}, ''name'': ''Node 1''}, ''branch2'': {''branch2-1'': {''name'': ''Node 2-1''}, ''name'': ''Node 2''}}}

Entonces, ahora hemos visto cómo obtener datos en nuestro programa Python. Guardar datos es igual de fácil:

with open(''newtree.yaml'', "w") as f: yaml.dump(dataMap, f)

Tienes un diccionario, y ahora tienes que convertirlo a un objeto de Python:

class Struct: def __init__(self, **entries): self.__dict__.update(entries)

Entonces puedes usar:

>>> args = your YAML dictionary >>> s = Struct(**args) >>> s <__main__.Struct instance at 0x01D6A738> >>> s...

y siga " Convertir el dict de Python al objeto ".

Para obtener más información, puede mirar pyyaml.org y this .