如何安全地将字典和列表转储到YAML中?

问题描述 投票:1回答:1

我希望将输出作为下面的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

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

python-3.x yaml pyyaml
1个回答
1
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.