Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Python dictionary to yaml

I have a dictionary, I am converting dictionary to yaml using yaml module in python. But Yaml is not converting properly.

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$'
            }]
        }
    }]
}

I tried :

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

I am getting meta.yaml file as following:

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

Here, {sourceImage: $disks_initializeParams_sourceImage$} and {network: $networkInterfaces_network$} is getting like dictionary. It means inner dictionary contents are not converting to yaml.

I also tried,

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

But getting same yaml file content.

How can I convert complete dictinary to yaml in Python?

like image 952
Harsha Biyani Avatar asked Oct 11 '18 14:10

Harsha Biyani


1 Answers

By default, PyYAML chooses the style of a collection depending on whether it has nested collections. If a collection has nested collections, it will be assigned the block style. Otherwise it will have the flow style.

If you want collections to be always serialized in the block style, set the parameter default_flow_style of dump() to False. For instance,

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

Documentation: https://pyyaml.org/wiki/PyYAMLDocumentation

like image 184
floydya Avatar answered Sep 21 '22 09:09

floydya