Source code for dcase_util.files.serialization

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function, absolute_import
import os
import logging
from dcase_util.utils import setup_logging


[docs]class Serializer(object): """Data serialization class""" @classmethod def logger(cls): logger = logging.getLogger(__name__) if not logger.handlers: setup_logging() return logger @classmethod def file_exists(cls, filename): """File exists Parameters ---------- filename : str Filename path Raises ------ IOError File does not exists. """ if not os.path.isfile(filename): message = '{name}: File does not exists [{filename}].'.format( name=cls.__class__.__name__, filename=filename ) cls.logger().exception(message) raise IOError(message)
[docs] @classmethod def load_yaml(cls, filename): """Load YAML file Parameters ---------- filename : str Filename path Returns ------- data """ cls.file_exists(filename=filename) try: import yaml except ImportError: message = '{name}: Unable to import YAML module. You can install it with `pip install pyyaml`.'.format(name=cls.__class__.__name__) cls.logger().exception(message) raise ImportError(message) try: with open(filename, 'r') as infile: return yaml.load(infile, Loader=yaml.FullLoader) except yaml.YAMLError as exc: cls.logger().error("Error while parsing YAML file [{file}]".format(file=filename)) if hasattr(exc, 'problem_mark'): if exc.context is not None: cls.logger().error(str(exc.problem_mark) + '\n ' + str(exc.problem) + ' ' + str(exc.context)) cls.logger().error(' Please correct data and retry.') else: cls.logger().error(str(exc.problem_mark) + '\n ' + str(exc.problem)) cls.logger().error(' Please correct data and retry.') else: cls.logger().error("Something went wrong while parsing yaml file [{file}]".format(file=filename)) return
[docs] @classmethod def load_cpickle(cls, filename): """Load CPICKLE file Parameters ---------- filename : str Filename path Returns ------- data """ cls.file_exists(filename=filename) try: import cPickle as pickle except ImportError: try: import pickle except ImportError: message = '{name}: Unable to import pickle module.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) return pickle.load(open(filename, "rb"))
[docs] @classmethod def load_json(cls, filename): """Load JSON file Parameters ---------- filename : str Filename path Returns ------- data """ cls.file_exists(filename=filename) try: import ujson as json except ImportError: try: import json except ImportError: message = '{name}: Unable to import json module. You can install it with `pip install ujson`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) return json.load(open(filename, "r"))
[docs] @classmethod def load_msgpack(cls, filename): """Load MSGPACK file Parameters ---------- filename : str Filename path Returns ------- data """ cls.file_exists(filename=filename) try: import msgpack except ImportError: message = '{name}: Unable to import msgpack module. You can install it with `pip install msgpack-python`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) return msgpack.load(open(filename, "rb"), encoding='utf-8')
[docs] @classmethod def load_marshal(cls, filename): """Load MARSHAL file Parameters ---------- filename : str Filename path Returns ------- data """ cls.file_exists(filename=filename) try: import marshal except ImportError: message = '{name}: Unable to import marshal module. You can install it with `pip install pymarshal`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) return marshal.load(open(filename, "rb"))
[docs] @classmethod def save_yaml(cls, filename, data): """Save data into YAML file Parameters ---------- filename : str Filename path data : Data to be stored Returns ------- None """ try: import yaml except ImportError: message = '{name}: Unable to import yaml module. You can install it with `pip install pyyaml`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) with open(filename, 'w') as outfile: outfile.write(yaml.dump(data, default_flow_style=False))
[docs] @classmethod def save_cpickle(cls, filename, data): """Save data into CPICKLE file Parameters ---------- filename : str Filename path data : Data to be stored Returns ------- None """ try: import cPickle as pickle except ImportError: try: import pickle except ImportError: message = '{name}: Unable to import pickle module.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) pickle.dump(data, open(filename, 'wb'), protocol=4) # Make compatible between 3.6-3.8, otherwise use => pickle.HIGHEST_PROTOCOL
[docs] @classmethod def save_json(cls, filename, data): """Save data into JSON file Parameters ---------- filename : str Filename path data : Data to be stored Returns ------- None """ try: import ujson as json except ImportError: try: import json except ImportError: message = '{name}: Unable to import json module. You can install it with `pip install ujson`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) json.dump(data, open(filename, 'w'))
[docs] @classmethod def save_msgpack(cls, filename, data): """Save data into MSGPACK file Parameters ---------- filename : str Filename path data : Data to be stored Returns ------- None """ try: import msgpack except ImportError: message = '{name}: Unable to import msgpack module. You can install it with `pip install msgpack-python`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) msgpack.dump(data, open(filename, 'wb'), use_bin_type=True)
[docs] @classmethod def save_marshal(cls, filename, data): """Save data into MARSHAL file Parameters ---------- filename : str Filename path data : Data to be stored Returns ------- None """ try: import marshal except ImportError: message = '{name}: Unable to import marshal module. You can install it with `pip install pymarshal`.'.format( name=cls.__class__.__name__ ) cls.logger().exception(message) raise ImportError(message) marshal.dump(data, open(filename, 'wb'))