Как safe_dump словарь и список в YAML? - PullRequest
1 голос
/ 06 ноября 2019

Я хочу вывод в виде YAML ниже:

 - item: Food_eat
   Food:
     itemId: 42536216
     category: fruit
     moreInfo:
       - "organic"

Я использовал следующий код для печати в том же порядке, что и выше, но вывод идет не так, как ожидалось.

Код:

import yaml

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

print(yaml.safe_dump(yaml_result))
print(yaml_test)

Вывод:

- Food:
    moreInfo:
    - organic
    category: fruit
    itemId: 42536216
  item: Food_eat

Не уверен, как получить желаемый вывод.

1 Ответ

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

ruamel.yaml (заявление об отказе: я являюсь автором этого пакета) имеет эту встроенную функцию, поскольку необходимо поддерживать ее способность выполнять обратную передачу (загружать, изменять, выгружать) данные YAML без внесения ложных изменений,Кроме того, по умолчанию используется YAML 1.2, тогда как PyYAML поддерживает только YAML 1.1 (устаревший более 10 лет назад).

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

Это зависит от современногоСпособность Python сохранять порядок вставки слова. В более старых версиях, таких как Python 2.7, вам придется явно создать объект CommentedMap (импортированный из ruamel.yaml.comments) и либо предоставить ему список кортежей (в правильном порядке), либо назначить пары ключ-значение вПорядок, в котором вы хотите, чтобы они были выгружены.

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


В PyYAML вы не хотите делать print(yaml.safe_dump(data)), поскольку это неэффективно как в отношении памяти, так и времени, всегда используйте вместо него yaml.safe_dump(data, sys.stdout).

...