Загрузка документа в виде необработанной строки в yaml с помощью PyYAML

StackOverflow https://stackoverflow.com/questions/6816236

  •  25-10-2019
  •  | 
  •  

Вопрос

Я хочу проанализировать документы 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, то заключите его в одинарные или двойные кавычки.Кроме того, вы можете попробовать буквальный стиль для вашего второго документа, который следует рассматривать как одиночный скаляр.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top