Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将字典和列表转储到YAML中?_Python 3.x_Yaml_Pyyaml - Fatal编程技术网

Python 3.x 如何将字典和列表转储到YAML中?

Python 3.x 如何将字典和列表转储到YAML中?,python-3.x,yaml,pyyaml,Python 3.x,Yaml,Pyyaml,我希望输出为以下YAML: - item: Food_eat Food: itemId: 42536216 category: fruit moreInfo: - "organic" 我使用了下面的代码,以与上面相同的顺序打印,但输出并不像预期的那样 代码: 输出: - Food: moreInfo: - organic category: fruit itemId: 42536216 item: Food

我希望输出为以下YAML:

 - item: Food_eat
   Food:
     itemId: 42536216
     category: fruit
     moreInfo:
       - "organic"
我使用了下面的代码,以与上面相同的顺序打印,但输出并不像预期的那样

代码:

输出:

- Food:
    moreInfo:
    - organic
    category: fruit
    itemId: 42536216
  item: Food_eat
不确定如何获得所需的输出。

ruamel.yaml(免责声明:我是该软件包的作者)确实有 此功能是内置的,因为支持其 往返(加载、修改、转储)YAML数据,而不引入虚假数据 变化。除此之外,它默认为YAML 1.2,而PyYAML仅为 支持YAML 1.1(已过时10多年)

其中:

  - item: Food_eat
    Food:
      foodNo: 42536216
      type: fruit
      moreInfo:
        - organic
这依赖于现代Python保持dict.For的插入顺序的能力 较旧的版本,如Python2.7,您必须显式地 对象
CommentedMap
(从
ruamel.yaml.comments
导入) 要么给它一个元组列表(按正确的顺序),要么分配 按您希望转储的顺序排列键值对

正如您在序列缩进中看到的,破折号有一个偏移量,这是您需要的 如果不重写PyYAML的发射器,则无法使用PyYAML


在PyYAML中,您不希望将
打印(yaml.safe\u dump(data))
作为
无论是内存还是时间效率都很低,总是使用
yaml.safe\u转储(数据,sys.stdout)
相反。

您想要的输出和实际的输出代表相同的东西。因为Python字典没有保证的键顺序,所以没有一个好方法可以让您得到您想要的。如果只是想让输出看起来有某种特定的方式,那么我建议尝试放弃它——对于所有实际用途来说,它们都不是他也一样。如果你真的需要得到想要的输出,你可以自己生成YAML(对于简单的数据结构来说很好,对于复杂的数据结构来说很难得到正确的结果)。ruamel.yaml中是否有任何功能可用于搜索yaml文件中的字符串。yaml文件只是一个文本文件,因此您可以使用Python中的常规搜索功能(在中使用
,或
re
),该功能还可以方便地提供行、列数据。如果您正在查找特定的键、值或项(或其子集),这可以很容易实现(但不是标准的),即使您的YAML中有标记,但您需要为结果的路径确定某种形式。如果您想要从中获取行、列信息,这将非常困难。请提出一个您确切期望的问题。
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