如何从纯 python 创建 yaml 文件?
Posted
技术标签:
【中文标题】如何从纯 python 创建 yaml 文件?【英文标题】:How can I create a yaml file from pure python? 【发布时间】:2012-02-26 11:05:10 【问题描述】:来自Using YAML with Python的示例
原始 YAML 文件包含此内容
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1
branch2:
name: Node 2
branch2-1:
name: Node 2-1
使用 yaml.load()
从文件加载内容并将其转储到新的 YAML 文件后,我得到了这个:
# tree format
treeroot:
branch1:
branch1-1: name:Node 1-1
name: Node 1
branch2:
branch2-1: name: Node 2-1
name: Node 2
直接从纯 python 构建 YAML 文件的正确方法是什么?我不想自己写字符串。我想建立字典和列表。
部分...
dataMap = 'treeroot':
'branch2':
'branch1-1':
'name': 'Node 1-1', # should be its own level
'name': 'Node 1'
【问题讨论】:
您是在问如何保证输出与输入相同的文件?如果是这样,则无法保证,因为字典没有预定义的顺序。 @Nate 对,这就是我的意图。我明白那个。我编辑并提供了部分结构。 Yaml 转储无法将内部 name: Node 1-1 解析到另一个级别.... 【参考方案1】:好的。我只是仔细检查了文档。我们在yaml.dump(data, optional_args)
的末尾需要这个
解决办法是这样的
yaml.dump(dataMap, f, default_flow_style=False)
其中 dataMap 是源 yaml.load()
,f 是要写入的文件。
【讨论】:
这个转储不写#tree format
评论。【参考方案2】:
假设您可能正在使用 PyYAML,那么您显示的输出是 not 复制粘贴 yaml.dump()
生成的内容,因为它包含评论,而 PyYAML 不会编写这些内容。
如果您想保留该注释,以及例如文件中的键顺序(当您将文件存储在修订控制系统中时很好),请使用 ¹:
import ruamel.yaml as yaml
yaml_str = """\
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1 # should be its own level
branch2:
name: Node 2
branch2-1:
name: Node 2-1
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4)
它准确地为您提供输入:
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1 # should be its own level
branch2:
name: Node 2
branch2-1:
name: Node 2-1
¹ 这是使用 ruamel.yaml 完成的,我是 PyYAML 的增强版本。
【讨论】:
【参考方案3】:您的第一个和第二个列表是等效的,只是符号不同。
请参阅:http://en.wikipedia.org/wiki/YAML#Associative_arrays 和 http://pyyaml.org/wiki/PyYAMLDocumentation#Dictionarieswithoutnestedcollectionsarenotdumpedcorrectly
【讨论】:
以上是关于如何从纯 python 创建 yaml 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring boot + .yaml 创建配置文件?
Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架
Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架