Как удалить 2 пробела из вывода дампа ruamel.yaml? - PullRequest
2 голосов
/ 08 ноября 2019

С помощью yaml.indent (sequence = 4, offset = 2) вывод верен, но в каждой строке есть дополнительное пространство, и я знаю, что это происходит из-за вышеупомянутой функции отступа. Есть ли способ удалить 2 лишних пробела из каждой строки (я не буду использовать strip ()).

Код:

import sys
import ruamel.yaml

data = [{'item': 'Food_eat', 'Food': {'foodNo': 42536216,'type': 'fruit','moreInfo': ['organic']}}]

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data, sys.stdout)

Вывод вышеуказанного кода:

  - item: Food_eat
    Food:
      foodNo: 42536216
      type: fruit
      moreInfo:
        - organic

Требуемый вывод:

- item: Food_eat
  Food:
    foodNo: 42536216
    type: fruit
    moreInfo:
      - organic

PS: я получил помощь от этого вопроса stackoverflow: Как safe_dump словарь и список в YAML?

1 Ответ

1 голос
/ 08 ноября 2019

Это не столько отступ, сколько смещение индикатора элемента последовательности. Это смещение берется в пределах пространства перед элементом, и если корневой узел является списком, это дает правильный YAML, но выглядит неоптимально.

Я пытался исправить это, но не пришелс хорошим решением. Пока я этого не сделаю, вам придется постобработать вывод, что легко сделать:

import sys
import ruamel.yaml

data = [{'item': 'Food_eat', 'Food': {'foodNo': 42536216,'type': 'fruit','moreInfo': ['organic']}}]

def strip_leading_double_space(stream):
    if stream.startswith("  "):
        stream = stream[2:]
    return stream.replace("\n  ", "\n")
    # you could also do that on a line by line basis
    # return "".join([s[2:] if s.startswith("  ") else s for s in stream.splitlines(True)])


yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
print('# < to show alignment')
yaml.dump(data, sys.stdout, transform=strip_leading_double_space)

, что дает:

# < to show alignment
- item: Food_eat
  Food:
    foodNo: 42536216
    type: fruit
    moreInfo:
      - organic

Конечно, было бы более эффективно, если быдополнительные пробелы в начале строки не будут сгенерированы.

...