Разбор YAML, возврат с номером строки

Я создаю генератор документов из данных YAML, который будет определять, из какой строки файла YAML генерируется каждый элемент. Каков наилучший способ сделать это? Поэтому, если файл YAML выглядит так:

- key1: item 1 key2: item 2 - key1: another item 1 key2: another item 2 

Я хочу что-то вроде этого:

 [ {'__line__': 1, 'key1': 'item 1', 'key2': 'item 2'}, {'__line__': 3, 'key1': 'another item 1', 'key2': 'another item 2'}, ] 

В настоящее время я использую PyYAML, но любая другая библиотека в порядке, если я могу использовать ее с Python.

3 Solutions collect form web for “Разбор YAML, возврат с номером строки”

Я сделал это, добавив крючки в Composer.compose_node и Constructor.construct_mapping :

 import yaml from yaml.composer import Composer from yaml.constructor import Constructor def main(): loader = yaml.Loader(open('data.yml').read()) def compose_node(parent, index): # the line number where the previous token has ended (plus empty lines) line = loader.line node = Composer.compose_node(loader, parent, index) node.__line__ = line + 1 return node def construct_mapping(node, deep=False): mapping = Constructor.construct_mapping(loader, node, deep=deep) mapping['__line__'] = node.__line__ return mapping loader.compose_node = compose_node loader.construct_mapping = construct_mapping data = loader.get_single_data() print(data) 

Если вы используете ruamel.yaml > = 0.9 (из которых я являюсь автором) и используем RoundTripLoader , вы можете получить доступ к свойству lc на элементах коллекции, чтобы получить строку и столбец, где они были запущены в исходном YAML:

 def test_item_04(self): data = load(""" # testing line and column based on SO # http://stackoverflow.com/questions/13319067/ - key1: item 1 key2: item 2 - key3: another item 1 key4: another item 2 """) assert data[0].lc.line == 2 assert data[0].lc.col == 2 assert data[1].lc.line == 4 assert data[1].lc.col == 2 

(подсчет начала строки и столбца равен 0).

Этот ответ показывает, как добавить атрибут lc в типы строк во время загрузки.

Для дальнейшего вдохновения, вот мой код для этого. Он содержит больше информации, чем указано выше, когда он сообщает информацию о местоположении, используя start_mark, end_mark для каждого файла dict / list / unicode (с использованием подклассов dict_node, list_node, unicode_node, соответственно).

https://gist.github.com/dagss/5008118

  • Обслуживание статического html в Google app engine Python
  • Отключить преобразование значения PyYAML
  • Вложенные переменные jinja2
  • Сохранить SQL в YAML как есть
  • Создайте модель из YAML / JSON на лету
  • YAML-файл url и скрипт в GAE python
  • есть ли что-нибудь, чтобы преобразовать xml -> yaml напрямую?
  • Преобразование CSV в YAML, с Unicode?
  • Python - лучший язык программирования в мире.