Разбор YAML и Python?

Каков наилучший способ разобрать файл YAML в объект Python?

Например, этот YAML:

Person: name: XYZ 

К этому классу Python:

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

Кстати, я использую PyYAML.

3 Solutions collect form web for “Разбор YAML и Python?”

Если ваш файл YAML выглядит так:

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

И вы установили PyYAML следующим образом:

 pip install PyYAML 

И код Python выглядит так:

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

Теперь переменная dataMap содержит словарь с данными дерева. Если вы печатаете dataMap с помощью PrettyPrint, вы получите что-то вроде:

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

Итак, теперь мы увидели, как получить данные в нашей программе Python. Сохранение данных так же просто:

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

У вас есть словарь, и теперь вы должны преобразовать его в объект Python:

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

Затем вы можете использовать:

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

и выполните команду « Преобразовать Python dict в объект ».

Для получения дополнительной информации вы можете посмотреть на pyyaml.org и на это .

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

add_path_resolver(tag, path, kind) добавляет неявный распознаватель тегов на основе пути. Путь – это список ключей, которые образуют путь к узлу в графике представления. Элементы Paths могут быть строковыми значениями, целыми числами или None. Тип узла может быть str, list, dict или 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 

Вот один из способов проверить, какая реализация YAML выбрала пользователь в virtualenv (или системе), а затем load_yaml_file определить load_yaml_file :

 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://stackoverflow.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://stackoverflow.com/questions/46326059/ https://stackoverflow.com/questions/36410756/ https://stackoverflow.com/questions/8022240/ Never use PyYaml in numerical applications. https://stackoverflow.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]) 
  • Как я могу контролировать, какую скалярную форму PyYAML использует для моих данных?
  • Текстовые пробелы / Невидимые - Показать пробелы
  • python yaml.dump плохой отступ
  • Почему PyYAML использует генераторы для создания объектов?
  • Формат дампа PyYAML
  • Можно ли исправить допустимый YAML с привязками / ссылками, отключенными с помощью Ruby или Python?
  • есть ли что-нибудь, чтобы преобразовать xml -> yaml напрямую?
  • Как сохранить или прочитать литерал возврата каретки и новой строки из yaml в python
  •  
    Interesting Posts for Van-Lav

    Использование Tweepy для прослушивания потока и поиска твитов. Как остановить предыдущий поиск и прослушать только новый поток?

    шаблон в python

    Запись в .txt-файл (UTF-8), python

    Позвоните по заданию Django celery по имени

    Django UnicodeEncodeError в форме рендеринга ('utf-8')

    Python передает указатель на функцию Delphi

    Удаление элемента из списка python, как сравниваются элементы (например, массивы numpy)?

    Модель Django не сохраняется при вызове save ()

    Классифицируйте файлы csv на основе информации за 18 долларов и найдите файл csv в каждой категории с самым большим уникальным номером в $ 4

    Снимок экрана с Pyglet

    Выделение элементов из списка python с определенными индексами

    MySQL-python Не удается подключиться к серверу

    Как мне форматировать число с переменным числом цифр в Python?

    Как преобразовать изображение в оттенках серого в RGB в OpenCV (Python) для визуализации контуров после обработки изображения в двоичном формате?

    Как я могу записать данные в формате YAML в файле?

    Python - лучший язык программирования в мире.