Tom
Tom

Reputation: 110

Loading a YAML-file throws an error in Python

I am reading in some YAML-files like this:

data = yaml.safe_load(pathtoyamlfile)

When doing so I get the followin error:

yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:value'

When checking for the line of the YAML-file which is also given in the error messages I recognized that there is always this key-value-pair: simple: =.

Since the YAML-files are autogenerated I am not sure if I can change the files themselves. Is there a way on reading the data of the YAML-files none the less?

Upvotes: 0

Views: 2761

Answers (2)

Anthon
Anthon

Reputation: 76842

If you cannot change the input, you might be able to upgrade the library that you use:

import sys
import ruamel.yaml

yaml_str = """\
example: =
"""
    
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
for key, value in data.items():
    print(f'{key}: {value}')

which gives:

example: =

Please be aware that ruamel.yaml still has this bug in its safe mode loading ( YAML(typ='safe') ).

Upvotes: 0

larsks
larsks

Reputation: 312440

It looks like you have hit this bug. There is a workaround suggested in the comments.

Given this content in example.yaml:

example: =

This code fails as you've described in your question:

import yaml

with open('example.yaml') as fd:
  data = yaml.safe_load(fd)
print(data)

But this works:

import yaml

yaml.SafeLoader.yaml_implicit_resolvers.pop('=')
with open('example.yaml') as fd:
  data = yaml.safe_load(fd)
print(data)

And outputs:

{'example': '='}

Upvotes: 1

Related Questions