Convert Python dictionary to yaml

31,194

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))
a: 1
b:
   c: 3
   d: 4

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

Share:
31,194
Harsha Biyani
Author by

Harsha Biyani

Updated on October 12, 2020

Comments

  • Harsha Biyani
    Harsha Biyani over 3 years

    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?

  • Maxim Suslov
    Maxim Suslov about 2 years
    For Python 3.8+ and PyYAML 6.x, the following works print(yaml.dump(document))