Home > Software design >  YAML File not loading with nested values
YAML File not loading with nested values

Time:01-08

I am writing a YAML parser in python using ruamel.yaml Reason for ruamel.yaml is it maintains comments which are key!

I know the issue is caused with the YAML file, and I am not sure on how to overcome this issue, or what a potential modification is. I have tried a few variations of indentation, but have struck out.

Keeping it simple, passing in source and trying to load it.

Code:

import os
import os.path
import ruamel.yaml
from ruamel.yaml import YAML

def main():
    source = "my_yaml.yml"
    # Check if the source fil is valid yaml
    try:
        yaml = ruamel.yaml.YAML()
        with open(source) as fp:
            # data is the file data and will be used down the line
            data = yaml.load(fp)

        if data is None:
            data = {}
        return data
    except:
        print("Yaml file is not valid. Please check the source.")
        return 1

if __name__ == "__main__":
    out = main()

YAML that works:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"

YAML that does not work:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"
  # this next item breaks my yaml
  - d3_nest3: "key6"
  d3_nest4: "key7"

Other Variations of YAML:

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# this next item breaks my yaml
- d3_nest3: "key6"
    d3_nest4: "key7"

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# this next item breaks my yaml
    - d3_nest3: "key6"
        d3_nest4: "key7"

CodePudding user response:

This: d3_nest2: key5 - d3_nest3: key6 d3_nest4: key7

is invalid YAML because once you start a block style mapping, every line needs to be of the form key: value until you change the indentation.

It is unclear what you want to achieve with providing a sequence element in the middle of a mapping, just as you cannot have a Python dict behave as a sequence for the 2nd element only. Maybe you want the following:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2:         # "key4" removed
  - d3_nest3: "key6"
  d3_nest4: "key7"

I recommend you create the data structure you want to have in Python (using nested dicts,lists and strings values), assuming you are more familiar with that, and then dump using ruamel.yaml so you'll get a better idea of what is correct YAML syntax.

The recommended extension for files containing YAML documents has been .yaml for over 15 years.

  •  Tags:  
  • Related