From 35017770060bb50eca05a184f95e633bce71fd08 Mon Sep 17 00:00:00 2001 From: Anton Pershin <tony.pershin@gmail.com> Date: Fri, 1 May 2020 19:06:46 +0300 Subject: [PATCH] Added support of serialization of objects into json files --- comsdk/comaux.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/comsdk/comaux.py b/comsdk/comaux.py index fbdae7b..eba52e1 100644 --- a/comsdk/comaux.py +++ b/comsdk/comaux.py @@ -6,8 +6,10 @@ from copy import deepcopy import importlib from abc import ABC, abstractmethod from typing import Optional, List, Tuple, Type, Any +import json import numpy as np +from jsons import JsonSerializable ArrayItemGetter = collections.namedtuple('ArrayItemGetter', ['key_path_to_array', 'i']) @@ -368,7 +370,7 @@ def parse_datafile(path, data_names, transform_funcs, cols_to_parse=[]): for i, data_name in enumerate(data_names): val = tmp[cols_to_parse[i]] data[data_name].append(transform_funcs[i](val)) - return data + return {name: np.array(array_) for name, array_ in data.items()} def parse_timed_numdatafile(path): ''' @@ -391,7 +393,7 @@ def parse_timed_numdatafile(path): for i, val in enumerate(tmp[1:]): timed_data[i] = float(val) data.append(timed_data) - return time, data + return time, np.array(data) def write_datafile(path, data): keys = list(data.keys()) @@ -418,6 +420,7 @@ def print_pretty_dict(d): for k, v in d.items(): print('{}: {}'.format(k ,v)) + def raise_exception_if_arguments_not_in_keywords_or_none(argument_names, kwargs) -> None: for arg in argument_names: if arg not in kwargs: @@ -426,6 +429,7 @@ def raise_exception_if_arguments_not_in_keywords_or_none(argument_names, kwargs) if kwargs[arg] is None: raise ValueError('Keywords "{}" must not be None'.format(arg)) + def take_value_if_not_none(value, default=None, transform=str) -> Any: if value is None: if default is None: @@ -434,3 +438,19 @@ def take_value_if_not_none(value, default=None, transform=str) -> Any: return default else: return transform(value) + + +def dump_to_json(obj: JsonSerializable, path_to_jsons: str = 'jsons') -> None: + filename = '{}.{}.json'.format(type(obj).__module__, type(obj).__name__) + filename = os.path.join(path_to_jsons, filename) + obj_as_dict = obj.json + with open(filename, 'w') as f: + json.dump(obj_as_dict, f, indent=4) + + +def load_from_json(cls: Type[JsonSerializable], path_to_jsons: str = 'jsons') -> JsonSerializable: + filename = '{}.{}.json'.format(cls.__module__, cls.__name__) + filename = os.path.join(path_to_jsons, filename) + with open(filename, 'r') as f: + obj_as_dict = json.load(f) + return cls.from_json(obj_as_dict) -- 2.17.1