From 791e9c303dba81188f394f7d536279ae8aa7aada Mon Sep 17 00:00:00 2001 From: sbosse Date: Wed, 28 Aug 2024 21:40:04 +0200 Subject: [PATCH] Wed 28 Aug 21:38:52 CEST 2024 --- src/SimNDT/gui/mat2json.py | 69 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/SimNDT/gui/mat2json.py diff --git a/src/SimNDT/gui/mat2json.py b/src/SimNDT/gui/mat2json.py new file mode 100644 index 0000000..a284adf --- /dev/null +++ b/src/SimNDT/gui/mat2json.py @@ -0,0 +1,69 @@ +import json + +import scipy.io as spio +import pandas as pd + +def _loadmat(filename): + ''' + this function should be called instead of direct spio.loadmat + as it cures the problem of not properly recovering python dictionaries + from mat files. It calls the function check keys to cure all entries + which are still mat-objects + ''' + data = spio.loadmat(filename, struct_as_record=False, squeeze_me=True) + return _check_keys(data) + +def _check_keys(dict): + ''' + checks if entries in dictionary are mat-objects. If yes + todict is called to change them to nested dictionaries + ''' + for key in dict: + if isinstance(dict[key], spio.matlab.mio5_params.mat_struct): + dict[key] = _todict(dict[key]) + return dict + +def _todict(matobj): + ''' + A recursive function which constructs from matobjects nested dictionaries + ''' + dict = {} + for strg in matobj._fieldnames: + elem = matobj.__dict__[strg] + if isinstance(elem, spio.matlab.mio5_params.mat_struct): + dict[strg] = _todict(elem) + else: + dict[strg] = elem + return dict + +def mat2json(matFileName=None,jsonFileName=None): + """ + Converts .mat file to .json and writes new file + + Parameters + ---------- + filename: Str + path/filename of .mat file + filepath: Str + path to write converted file + + Returns + ------- + None + + Examples + -------- + >>> mat2json(blah blah) + + """ + + matlabFile = _loadmat(matFileName) + #pop all those dumb fields that don't let you jsonize file + matlabFile.pop('__header__') + matlabFile.pop('__version__') + matlabFile.pop('__globals__') + #jsonize the file - orientation is 'index' + jsonData = pd.Series(matlabFile).to_json() + with open(jsonFileName,'w') as f: + f.write(jsonData) +