#python #yaml #pyyaml
Вопрос:
У меня есть куча номинально файлов YAML, которые могут содержать или не содержать действительный YAML.
В каждом файле есть только несколько ключей, о которых я забочусь. И я уверен, что эти разделы действительно содержат действительный YAML.
Есть ли способ проанализировать файл YAML, ограничивая анализируемые ключи?
Например, если бы ключ, который мне нужен, был назван хостами, я бы хотел иметь возможность сделать что-то вроде:
with open('maybe_valid.yaml', 'r') as file:
conf = yaml.load(file, Loader=yaml.SafeLoader, keys=['hosts'])
Я хотел бы избежать необходимости вручную сканировать файл на наличие ключа/ов и извлекать/угадывать, какие строки являются частью раздела, если смогу.
Кроме того, если бы я мог просто ограничить глубину, которую проходит синтаксический анализ, это также сработало бы. Т. Е. если бы был способ указать, чтобы он передавал только узлы верхнего уровня.
Комментарии:
1. Это невозможно сделать: если файл на самом деле не является допустимым YAML, анализатор YAML не сможет найти
hosts
ключ. Как только он попадет в неверные данные, все ставки будут отменены. Невозможно определить «только узлы верхнего уровня» без анализа всего файла. Может быть, вы можете заранее применить некоторые текстовые манипуляции для очистки данных или извлечь только те части, которые вы хотите?
Ответ №1:
К сожалению, yaml.load() завершится ошибкой, если файл не полностью соответствует допустимому yaml.
Некоторые вещи, которые следует попробовать, могут включать:
- игнорируйте все файлы, в которых нет строки нужного вам ключа
- запустите все ваши файлы через yaml.load() и следите за неудачными файлами. Если неудачный список yaml достаточно короткий, вы можете сделать это вручную.
- определите согласованный шаблон для недопустимых разделов yaml и удалите их из этих файлов, прежде чем пытаться загрузить их в yaml.load ().