питон руамель.пакет yaml, как получить строки комментариев в заголовке?

#python #comments #ruamel.yaml

Вопрос:

Я хочу получить комментарии к файлу YAML в строках заголовка, например

 # 11111111111111111 # 11111111111111111 # 22222222222222222 # bbbbbbbbbbbbbbbbb --- start: ....   

И я использовал ca атрибут для загруженных данных, но обнаружил, что на нем нет этих комментариев. Есть ли другой способ получить эти комментарии?

Комментарии:

1. Я бы ожидал, что анализатор YAML проигнорирует комментарии. Поэтому вы можете просто открыть файл традиционным способом, а затем проверить, не является ли первый значимый символ #. Это будет сложнее, если вы хотите извлечь комментарии, которые следуют обычному синтаксису YAML — например, «начало: # Это начало».

2. @JCaesar ruamel.yaml (дискл. Я автор) явно пытается сохранить комментарии в режиме «туда-обратно», так как это, в общем, потеря для человека, который должен продолжать работать над документом YAML, который (также) загружается и сбрасывается компьютерной программой.

3. Спасибо всем вам, я подумываю о том, чтобы использовать традиционный способ получения этих комментариев, а затем вставить их в другие файлы yaml.

Ответ №1:

В настоящее время ( ruamel.yaml==0.17.17 ) комментарии , которые появляются до маркера запуска документа ( --- ), не передаются от DocumentStartToken к DocumentStartEvent , поэтому эти комментарии фактически теряются во время синтаксического анализа. Даже если они были переданы, нетривиально сохранить их, поскольку DocumentStartEvent они молча отбрасываются во время композиции.

Вы можете либо поместить комментарии после окончания индикатора директив ( --- ), который позволяет вам без проблем просматривать комментарии с помощью .ca атрибута, либо вообще удалить этот индикатор, поскольку он является лишним (по крайней мере, в вашем примере). В качестве альтернативы вам придется написать небольшую обертку вокруг загрузчика:

 import sys import pathlib import ruamel.yaml  fn = pathlib.Path('input.yaml')  def load_with_pre_directives_comments(yaml, path):  comments = []  text = path.read_text()  if 'n---n' not in text and 'n--- ' not in text:  return yaml.load(text), comments  for line in text.splitlines(True):  if line.lstrip().startswith('#'):  comments.append(line)  elif line.startswith('---'):  return yaml.load(text), comments  break  yaml = ruamel.yaml.YAML() yaml.explicit_start = True data, comments = load_with_pre_directives_comments(yaml, fn) print(''.join(comments), end='') yaml.dump(data, sys.stdout)  

что дает:

 # 11111111111111111 # 11111111111111111 # 22222222222222222 # bbbbbbbbbbbbbbbbb --- start: 42