Как обрабатывать поток YAML в Python

У меня есть приложение командной строки, которое постоянно выводит данные YAML в форме:

- col0: datum0
  col1: datum1
  col2: datum2
- col0: datum0
  col1: datum1
  col2: datum2
...

Так будет вечно. Я хотел бы написать сценарий Python, который непрерывно считывает каждую из этих записей.

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

Или мой единственный вариант - разбить данные самостоятельно и по крупицам передать их в PyYAML?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
2 286
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Все ссылки на поток в документации, похоже, относятся к потоку документов ... Я никогда не пробовал использовать его так, как вы описываете, но похоже, что разбиение данных на такой поток документов является разумный подход.

Ответ принят как подходящий

Вот что я в итоге использовал, поскольку, похоже, нет встроенного метода для выполнения того, что я хочу. Эта функция должна быть достаточно общей, чтобы она могла читать в потоке YAML и возвращать объекты верхнего уровня по мере их обнаружения.

def streamInYAML(stream):
    y = stream.readline()
    cont = 1
    while cont:
        l = stream.readline()
        if len(l) == 0:
            cont = 0
        else:
            if l.startswith(' '):
                y = y + l
            else:
                yield yaml.load(y)
                y = l

Кто-нибудь может сделать лучше?

Единственное изменение, которое я хотел бы сделать, - это if l.startswith(' '): в if not l.startswith('-'):, поскольку это решило проблему с кодировкой, связанную с utf8, при передаче созданного раздела строки yaml загрузчику / парсеру yaml. Я думаю, это произошло из-за многострочных строк yaml внутри раздела -

Kevin Andrews 29.10.2016 00:19

Другие вопросы по теме