Загрузка документа в виде необработанной строки в yaml с помощью PyYAML
Вопрос
Я хочу проанализировать документы yaml следующим образом
meta-info-1: val1
meta-info-2: val2
---
Plain text/markdown content!
jhaha
Если я load_all
это с PyYAML, я получаю следующее
>>> list(yaml.load_all(open('index.yml')))
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha']
Чего я пытаюсь добиться здесь, так это того, что файл yaml должен содержать два документа, а второй должен интерпретироваться как однострочный документ, более конкретно, любой большой текст с форматированием markdown.Я не хочу, чтобы это анализировалось как синтаксис YAML.
В приведенном выше примере PyYAML возвращает второй документ в виде одной строки.Но если во втором документе есть :
персонаж вместо !
например, я получаю синтаксическую ошибку.Это потому, что PyYAML анализирует содержимое этого документа.
Есть ли способ, которым я могу сказать PyYAML, что второй документ - это просто необработанная строка, и не разбирать его?
Редактировать:Там есть несколько отличных ответов.Хотя использование кавычек или буквального синтаксиса решает указанную проблему, я бы хотел, чтобы пользователи могли писать обычный текст без каких-либо дополнительных усилий.Только эти трое -
's (или .
's) и напишите большой объем обычного текста.Который также может включать в себя цитаты.Итак, я хотел бы знать, могу ли я сказать PyYAML, чтобы он проанализировал только один документ, а второй передал мне в необработанном виде.
Эйдт 2:Итак, адаптируя идею agf, вместо использования try / except в качестве второго документа может быть допустимым синтаксис yaml,
config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)
Спасибо agf.
Решение
Вы можете сделать
raw = open(filename).read()
docs = []
for raw_doc in raw.split('\n---'):
try:
docs.append(yaml.load(raw_doc))
except SyntaxError:
docs.append(raw_doc)
Если у вас не будет контроля над форматом исходного документа.
Из документов PyYAML,
Двойные кавычки - это самый мощный стиль и единственный стиль, который может выражать любое скалярное значение.Скаляры, заключенные в двойные кавычки, позволяют экранировать.Используя экранирующие последовательности \x** и \u****, вы можете выразить любой символ ASCII или Unicode.
Таким образом, похоже, что нет способа представить произвольный скаляр при синтаксическом анализе, если он не заключен в двойные кавычки.
Другие советы
Если все, что вы хотите, это экранировать символ двоеточия в YAML, то заключите его в одинарные или двойные кавычки.Кроме того, вы можете попробовать буквальный стиль для вашего второго документа, который следует рассматривать как одиночный скаляр.