Python 3.x 如何将字典和列表转储到YAML中?
我希望输出为以下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
- 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