如何将safe_dump字典和列表转成YAML?

How to safe_dump the dictionary and list into YAML?

我想要输出为下面的 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

不确定如何获得所需的输出。

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) 代替。