将Python字典转换为yaml

34

我有一个字典,我正在使用Python的yaml模块将字典转换为Yaml。但是Yaml转换不正确。

output_data = {
    'resources': [{
        'type': 'compute.v1.instance',
        'name': 'vm-created-by-deployment-manager',
        'properties': {
            'disks': [{
                'deviceName': '$disks_deviceName$',
                'boot': '$disks_boot$',
                'initializeParams': {
                    'sourceImage': '$disks_initializeParams_sourceImage$'
                },
                'autoDelete': '$disks_autoDelete$',
                'type': '$disks_type$'
            }],
            'machineType': '$machineType$',
            'zone': '$zone$',
            'networkInterfaces': [{
                'network': '$networkInterfaces_network$'
            }]
        }
    }]
}

我尝试了:

import yaml
f = open('meta.yaml', 'w+')
yaml.dump(output_data, f, allow_unicode=True)

以下是我得到的meta.yaml文件:

resources:
- name: vm-created-by-deployment-manager
  properties:
    disks:
    - autoDelete: $disks_autoDelete$
      boot: $disks_boot$
      deviceName: $disks_deviceName$
      initializeParams: {sourceImage: $disks_initializeParams_sourceImage$}
      type: $disks_type$
    machineType: $machineType$
    networkInterfaces:
    - {network: $networkInterfaces_network$}
    zone: $zone$
  type: compute.v1.instance

在这里,{sourceImage: $disks_initializeParams_sourceImage$}{network: $networkInterfaces_network$}就像是一个字典这意味着内部字典内容不会转换为YAML格式

我也尝试过,

output_data = eval(json.dumps(output_data)) 
ff = open('meta.yaml', 'w+')
yaml.dump(output_data, ff, allow_unicode=True)

但获取相同的yaml文件内容。

我如何在Python中将完整的字典转换为yaml?


6
yaml.dump(output_data, ff, allow_unicode=True, default_flow_style=False) - floydya
2
@floydya:谢谢,它起作用了。请写一个答案,这样我就可以接受并点赞你的答案。 - Harsha Biyani
1个回答

26

默认情况下,PyYAML 会根据集合是否嵌套来选择其样式。如果集合有嵌套集合,则将分配块样式。否则它将具有流样式。

如果您希望始终以块样式序列化集合,请将 dump() 的参数 default_flow_style 设置为 False。例如,

>> print(yaml.dump(yaml.load(document), default_flow_style=False))
a: 1
b:
   c: 3
   d: 4

文档:https://pyyaml.org/wiki/PyYAMLDocumentation


3
对于 Python 3.8+ 和 PyYAML 6.x,以下代码可行:print(yaml.dump(document)) - Maxim Suslov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接