Многострочный в последовательности в YAML

2

Я хотел бы иметь несколько строк в последовательности в YAML. Вот как я это делаю, но у меня есть проблемы с синтаксическим анализом в Python:

Element: |
   - multiple lines
     come here

Делая это таким образом, когда я анализирую это с Python, я все еще вижу - в проанализированных данных. Кажется, YAML не понимает, что это список.

Теги:
syntax
yaml

2 ответа

0
Лучший ответ

Ваш ввод не является списком, YAML знает только о отображениях (созданных как Python dict и последовательности (созданных как list Python).

Обычно - это индикатор записи последовательности блоков, но поскольку вы начинаете литерал стиля блока в первой строке как значение для ключевого Element, из-за | все, что после него является отступом, является частью этого скаляра (построенного как строка Python).

Что вы хотите сделать, это вывести индикатор за пределы буквального скаляра:

Element: 
- |
  multiple lines
  come here

Если вы загрузите это в Python в переменную data тогда data['Element'][0] будет строкой 'multiple lines\ncome here\n'. То есть: каждая новая строка в вашем буквальном скаляре будет новой строкой в вашей строке, и в этой строке будет одна последняя строка новой строки, независимо от того, сколько пустых строк следует (это отсечение). Если вы хотите, чтобы в конце не было новой строки, используйте |- (зачистка), а если вы хотите, чтобы все новые строки до обрезки использовали, то используйте |+ (сохранение). Эти дополнения к | называются грохотом показателей.

Если у вас есть вышеперечисленное в файле с именем input.yaml:

import sys
from pathlib import Path
import ruamel.yaml

input = Path('input.yaml')

yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(input)
print(f'{data["Element"][0]!r}')  # print the representation, so you can see where the newlines are

который дает:

'multiple lines\ncome here\n'
  • 0
    Спасибо, Антон. Однако я получаю следующую ошибку: yaml.scanner.ScannerError: при сканировании простого ключа не удалось найти ожидаемое «:». Я использую yaml вместо ruamel.yaml. Может ли это быть проблемой?
  • 0
    Я могу загрузить приведенный выше код без каких-либо проблем в PyYAML (при условии, что вы имеете в виду «использование yaml»). Возможно, вы делаете что-то не так, но поскольку вы не включили в свой вопрос реальный код, вам не нужно будет выяснять, что вы на самом деле делаете неправильно.
Показать ещё 1 комментарий
1

Используйте этот синтаксис (по крайней мере для yaml Python yaml)

stuff:
  - 'this is a multiline
  string'

Другими словами заключите в кавычки строку и сделайте отступ в ее продолжении

  • 0
    Спасибо за ваше представление. Если я также хотел бы разорвать строку прямо, когда у меня есть новая строка, аналогично функциональности, предоставленной "|" в YAML я буду использовать '\ n' внутри цитаты, или есть лучшая техника?
  • 0
    Просто добавьте настоящую новую строку после начального предложения
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню